为什么 Angular 2 绑定在这种情况下不起作用? (子组件输入字段)

Why does Angular 2 binding not work in this case? (sub component input field)

我有一个名为 AppComponent 的 (Angular 2) 根组件,它使用另一个名为 Subcomp 的组件。 App 将 @Input() 参数传递给 Sub。 Sub 使用此变量在输入字段中进行单向绑定。

现在我...

  1. 将参数的值设置为某个初始值("start");这按预期显示在输入字段中。
  2. 将输入字段中的文本更改为其他内容。
  3. 单击按钮以编程方式将 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">