Observable元素上的双向数据绑定

时间:2018-09-20 13:05:13

标签: angular typescript rxjs observable

我想将isSelected绑定到包裹在可观察对象中的对象。我一个人尝试(没有可观察到的效果)。 但是,在我的组件中,即使选中了复选框,measure.isSelected始终返回false。

{
  somethingChanged: any; // type????

  ....

  dateChanged(val: any) {
    console.log('Date changed', val);
    this.somethingChanged = val;
  }
}

在我的组件内部:

          <tr *ngFor="let measure of criteriaSelectedMeasures$ | async ; let i = index">
            <td>{{measure.type}}</td>
            <td>{{measure.equipment}}</td>
            <td>{{measure.axis}}</td>
            <td>{{measure.direction}}</td>
            <td>{{measure.pr}}</td>
            <td>{{measure.section}}</td>
            <td>{{measure.agregation}}</td>
            <td>{{measure.measureType}}</td>
            <td>{{measure.qualification}}</td>
            <td>
              <p-checkbox name="criteria-measure-{{i}}" binary="true" [(ngModel)]="measure.isSelected"></p-checkbox>
            </td>
          </tr>

对我来说,双向绑定在这里不起作用,因为异步管道或预订可观察对象将创建带有另一个引用的不同对象。

我是对的吗?还有另一种方法可以实现这一目标吗? (也许使用ngModelChange吗?)

1 个答案:

答案 0 :(得分:0)

我想说您不应该修改来自可观察对象的对象。如果要修改某些特定的度量,则将它们直接作为数组传递,然后绑定到它们。仅当组件将显示数据而不修改它们时,才将可观察对象传递给组件。

可观察性通常不是角度的最佳解决方案。特别是它们仅以一种方式传递信息,您通常应将发出的对象视为不可变的,否则将处于黑客攻击的边缘。

还请注意,除非有保护您的消息来源的方法,否则两个订阅(一个带有|async且一个直接订阅)可能不是最好的选择。与shareReplay

另一种解决方案虽然有点尴尬,但如果您确实希望将对象作为可观察对象进行传递,则可以在传递组件的组件中使用@Output() measureSelectionChange,例如当单击复选框且组件外部的某物负责实际修改度量(并可能将修改后的一组度量再次推入组件)时,度量ID和新的选择状态。