为什么 Angular 2 绑定在这种情况下不起作用? (子组件输入字段)
Why does Angular 2 binding not work in this case? (sub component input field)
我有一个名为 AppComponent 的 (Angular 2) 根组件,它使用另一个名为 Subcomp 的组件。 App 将 @Input()
参数传递给 Sub。 Sub 使用此变量在输入字段中进行单向绑定。
现在我...
- 将参数的值设置为某个初始值("start");这按预期显示在输入字段中。
- 将输入字段中的文本更改为其他内容。
- 单击按钮以编程方式将 AppComponent 中的值重置回 "start"。
然后我希望输入字段也重置为 "start",但它会继续显示从第 2 步开始更改的文本。这是正确的行为吗?
代码:
class Todo {
constructor(public title: string) {}
}
@Component({
selector: 'subcomp',
directives: [FORM_DIRECTIVES],
template: `New Title: <input type="text" [ngModel]="subtodo.title">`
})
export class Subcomp {
@Input() subtodo: Todo;
}
@Component({
selector: 'my-app',
directives: [Subcomp],
template: `To do: {{todo.title}}<br/>
<subcomp [subtodo]="todo"></subcomp><br/>
<button (click)="update()">Update</button>`
})
export class AppComponent {
todo: Todo = new Todo('start');
update() {
this.todo = new Todo('start');
}
}
是的,这是正确的行为。
因为您只在 Subcomp
中使用单向数据绑定,所以 todo.title
的值在您更改输入字段中的文本时不会改变。
调用update()
时,会创建一个新的Todo
对象,但是todo.title
的值是start
,所以当Angular变化检测查看 [ngModel]="subtodo.title"
,它没有发现任何变化 – subtodo.title
的旧值与当前值一样是 start
。 Angular 变更检测按值比较基元类型(数字、字符串、布尔值)。
为了证明这一点,试试这个:
update() {
this.todo = new Todo('start' + new Date());
}
或者试试这个:
<input type="text" [(ngModel)]="subtodo.title">
我有一个名为 AppComponent 的 (Angular 2) 根组件,它使用另一个名为 Subcomp 的组件。 App 将 @Input()
参数传递给 Sub。 Sub 使用此变量在输入字段中进行单向绑定。
现在我...
- 将参数的值设置为某个初始值("start");这按预期显示在输入字段中。
- 将输入字段中的文本更改为其他内容。
- 单击按钮以编程方式将 AppComponent 中的值重置回 "start"。
然后我希望输入字段也重置为 "start",但它会继续显示从第 2 步开始更改的文本。这是正确的行为吗?
代码:
class Todo {
constructor(public title: string) {}
}
@Component({
selector: 'subcomp',
directives: [FORM_DIRECTIVES],
template: `New Title: <input type="text" [ngModel]="subtodo.title">`
})
export class Subcomp {
@Input() subtodo: Todo;
}
@Component({
selector: 'my-app',
directives: [Subcomp],
template: `To do: {{todo.title}}<br/>
<subcomp [subtodo]="todo"></subcomp><br/>
<button (click)="update()">Update</button>`
})
export class AppComponent {
todo: Todo = new Todo('start');
update() {
this.todo = new Todo('start');
}
}
是的,这是正确的行为。
因为您只在 Subcomp
中使用单向数据绑定,所以 todo.title
的值在您更改输入字段中的文本时不会改变。
调用update()
时,会创建一个新的Todo
对象,但是todo.title
的值是start
,所以当Angular变化检测查看 [ngModel]="subtodo.title"
,它没有发现任何变化 – subtodo.title
的旧值与当前值一样是 start
。 Angular 变更检测按值比较基元类型(数字、字符串、布尔值)。
为了证明这一点,试试这个:
update() {
this.todo = new Todo('start' + new Date());
}
或者试试这个:
<input type="text" [(ngModel)]="subtodo.title">