【问题标题】:Angular 2 how to implement two way binding for level 2 child?Angular 2如何为2级孩子实现两种方式绑定?
【发布时间】:2017-09-13 03:38:27
【问题描述】:

对象是父组件的属性

const public object = {value1: 'test1'};

它被用作子组件的属性

<app-child [(obj)]="object"></app-child>

子组件本身还有其他子组件将value1 字段作为属性

<app-child-2 [(value)]="obj.value1"></app-child-2>

问题是,我可以将[(value)] 用于第二个孩子吗,或者我可以设置从父母到第二个孩子的双向绑定的唯一方法是不是

<app-child-2 [value]="obj.value1" (valueChange)="updateObjectFun()"></app-child-2>

updateObjectFun 将设置发出 objectChange 输出的位置。

【问题讨论】:

  • 你试过ngModel 吗?
  • 你应该使用 [(ngModel)] 而不是 [(propertyName)]
  • app-child 是 appchild2 的父级吗?然后 app-child2 应该发射到 app-child 再发射到父级。

标签: javascript angular angular-components


【解决方案1】:

如果您的子组件具有正确的“接口”,您可以使用双向绑定语法。因此,例如,如果您的第二个子组件具有value 的输入绑定和valueChange 的输出绑定,那么您可以使用双向绑定语法:[(value)]="obj.value1"

双向绑定语法完全等同于:

[value]="obj.value1" (valueChange)="obj.value1=$event"

其中$event 是从组件的 valueChange 输出属性发出的对象。如果您可以控制组件的接口(即您可以创建任何您想要的属性),那么请随意利用两种方式的绑定语法。

ngModel 仅在您无法控制要绑定到的组件的接口的情况下才需要,因此无法使用双向绑定语法快捷方式。

(上面的说法并不完全正确,因为 ngModel 在处理模板驱动的表单时还有一个额外的用途,但对于您的用例,这不是问题)。

【讨论】:

  • 知道为什么这个例子不起作用吗? angular-yqhzlp.stackblitz.io
  • 在前面的示例中,单击顶部按钮会更新所有三个按钮,但单击底部按钮只会更新其直接父级。在这个新示例中,我将层次结构更改为在顶部使用 EventEmitter,在底部使用 BehaviorSubject。现在单击任一按钮更新所有三个绑定。 stackblitz.com/edit/…
  • 我想你误解了这里的问题。问题不在于如何实现双向绑定(您的答案涵盖),而在于您尝试通过 2 层嵌套组件来实现这一点时会发生什么。我认为问题的作者是正确的,因为您必须将中间层模板中的输入和输出分开,以使其一直正确传播。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2018-10-19
相关资源
最近更新 更多