Я столкнулся с интересным поведением в своем приложении 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.





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);
@HichamBouchihi Я обновил свой ответ, когда из Angular генерируется ошибка, когда я использую ее в дочернем компоненте!
Не понял ответа, извините. Мой вопрос заключался в том, почему у меня нет каких-либо ошибок, когда input.required находится в двойной привязке. Я говорю о консоли, почему она принудительно устанавливает значение вместо того, чтобы ничего не делать или выдавать ошибку в консоли.
@HichamBouchihi В приведенном ниже стеке, пожалуйста, попробуйте переключить второй флажок и проверить консоль, мы получаем ошибку, как и ожидалось, из-за нового API сигнала, нам нужно реализовать его определенным образом, только тогда мы получаем ошибку, сделайте поделитесь стекблицем с проблемами, когда ошибка консоли не возникает, я рассмотрю это, но на данный момент я могу получить ошибку, когда переключаю второй флажок проверьте этот стекблиц
Ах, спасибо, я понял, в моем случае я не получил ошибку, поэтому я был озадачен
Почему это возможно, если это не должно генерировать какую-то ошибку или исключение в консоли? Как функция может изменить весь тип и элемент с функции на логическое значение