Angular Behavior: тип свойства меняется с SignalFunction на Boolean

Я столкнулся с интересным поведением в своем приложении Angular и надеюсь, что кто-нибудь сможет пролить на него свет. Вот сценарий: У меня есть рабочий фрагмент кода, в котором я определяю свойство под названием isSelection следующим образом:

public isSelection = model.required<boolean>();
public getTypeof(value: any): string {
    return typeof value;
}

Свойство isSelection инициализируется сигналом model.required.

<input type = "checkbox" [(ngModel)] = "isSelection" />
<p>{{ getTypeof(isSelection) }}</p>

Я привязываю свойство isSelection к вводу флажка, используя [(ngModel)]

В абзаце отображается тип isSelection. В этом случае isSelection отображается как функция, когда я нажимаю флажок, тип isSelection никогда не менялся.

Однако, когда я меняю объявление свойства на:

public isSelection = input.required<boolean>();

Поведение меняется, и тип isSelection, похоже, меняется с функции на boolean.

NB. Я использую последнюю версию angular 17.3.1.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

input.required<boolean>() -> предназначено для односторонней привязки, но вы используете двустороннюю привязку, поэтому функция заменяется значением boolean

Чтобы исправить это, мы можем использовать одностороннюю привязку в HTML.

<input type = "checkbox" [ngModel] = "isSelection2" />

Когда я использую дочерний код и предоставляю входные данные от родительского элемента, angular просто выдает ошибку, когда я пытаюсь использовать [(ngModel)] = "isSelection2"

model.required<boolean>() -> предназначено для двусторонней привязки, поэтому ваш пример работает отлично, поскольку делает именно то, что должен!

См. приведенный ниже код/Stackblitz:

ребенок

import { Component, input, model } from '@angular/core';
import { FormsModule } from '@angular/forms';

@Component({
  selector: 'app-child',
  standalone: true,
  imports: [FormsModule],
  template: `
    <input type = "checkbox" [(ngModel)] = "isSelection" />
    <pre>{{ isSelection() }}</pre>
    <p>{{ getTypeof(isSelection) }}</p>
    <hr />
    <input type = "checkbox" [ngModel] = "isSelection2" />
    <pre>{{ isSelection2() }}</pre>
    <p>{{ getTypeof(isSelection2) }}</p>
  `,
})
export class ChildComponent {
  public isSelection = model.required<boolean>();
  public isSelection2 = input.required<boolean>();

  public getTypeof(value: any): string {
    return typeof value;
  }
}

main.ts

import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
import { ChildComponent } from './app/child/child.component';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ChildComponent],
  template: `<app-child [isSelection2] = "true" [isSelection] = "false"/>`,
})
export class App {}

bootstrapApplication(App);

Рабочий Stackblitz

Почему это возможно, если это не должно генерировать какую-то ошибку или исключение в консоли? Как функция может изменить весь тип и элемент с функции на логическое значение

Hicham Bouchikhi 21.03.2024 12:22

@HichamBouchihi Я обновил свой ответ, когда из Angular генерируется ошибка, когда я использую ее в дочернем компоненте!

Naren Murali 21.03.2024 12:23

Не понял ответа, извините. Мой вопрос заключался в том, почему у меня нет каких-либо ошибок, когда input.required находится в двойной привязке. Я говорю о консоли, почему она принудительно устанавливает значение вместо того, чтобы ничего не делать или выдавать ошибку в консоли.

Hicham Bouchikhi 21.03.2024 12:31

@HichamBouchihi В приведенном ниже стеке, пожалуйста, попробуйте переключить второй флажок и проверить консоль, мы получаем ошибку, как и ожидалось, из-за нового API сигнала, нам нужно реализовать его определенным образом, только тогда мы получаем ошибку, сделайте поделитесь стекблицем с проблемами, когда ошибка консоли не возникает, я рассмотрю это, но на данный момент я могу получить ошибку, когда переключаю второй флажок проверьте этот стекблиц

Naren Murali 21.03.2024 12:36

Ах, спасибо, я понял, в моем случае я не получил ошибку, поэтому я был озадачен

Hicham Bouchikhi 21.03.2024 12:41

Другие вопросы по теме