【问题标题】:Checkbox state not reflecting ngModel value in Angular 2复选框状态未反映 Angular 2 中的 ngModel 值
【发布时间】:2018-02-13 13:25:07
【问题描述】:

所以我的问题是我有一个复选框,其状态不反映其 ngModel 值。 让我解释一下架构:我有一个管理产品列表的服务,以及一个应该显示此列表并让用户选择或取消选择任何产品的组件。如果用户取消选择产品并且不再有选择的产品,我会尝试重新选择它们。但是当我这样做时,触发事件的复选框不会更新(以图形方式,因为它的 ngModel 是),而所有其他复选框都正确更新。

这里是服务(我使用 BehaviourSubject 以便我的组件可以监听它的变化):

@Injectable()
export class ProductService {
    private productsSubject: BehaviorSubject<Array<{name: string, selected: boolean}>>
    public products = this.productsSubject.asObservable();

    constructor() {
        this.productsSubject.next([
            {name: 'Product 1', selected: true},
            {name: 'Product 2', selected: true},
            {name: 'Product 3', selected: true}
        ]);
    }

    public select(name: string) {
        // In this method I change "selected" for the corresponding product.
        // if no product is selected, I select them all.
    }
}

这是组件视图:

<li *ngFor="let product of ProductService.products | async">
      {{product.name}}{{product.selected}}
      <input type="checkbox" [(ngModel)]="product.selected" (ngModelChange)="ProductService.select(product.name)">
</li>

对于它自己的组件,它除了注入 ProductService 之外没有什么特别的。

最后,当我运行应用程序时,一切正常,当我选中和取消选中复选框时,模型会更新,复选框状态也会更新。除非在一种情况下

开始:

Product 1 -> selected: true + checkbox ticked
Product 2 -> selected: false + checkbox not-ticked
Product 3 -> selected: false + checkbox not-ticked

我取消选中第一个产品,“选择”方法完成重新选择所有产品的工作,我有这个:

Product 1 -> selected: true + checkbox **NOT-TICKED**
Product 2 -> selected: true + checkbox ticked,
Product 3 -> selected: true + checkbox ticked

你知道为什么触发事件的复选框没有以图形方式更新吗?

提前感谢您的帮助。

【问题讨论】:

    标签: javascript angular checkbox angular2-template angular2-ngmodel


    【解决方案1】:

    要使用 ngModel,您需要有一个 name 属性,此外,如果您使用引导样式的复选框,它实际上会隐藏该复选框,在这种情况下,您的标签上需要 for="id"。通常我设置&lt;input type="checkbox" name="something" id="something" &gt;

    【讨论】:

      【解决方案2】:

      目前您正在使用单向数据绑定:

      [ngModel]="product.selected"
      

      使用双向数据绑定:

      [(ngModel)]="product.selected"
      

      因此更改会反映在您的 UI 中。

      【讨论】:

      • 哇。这是单向数据绑定吗?那么[ngModel]="product.selected"[(ngModel)]="{{product.selected}}"?有什么区别
      • 它没有任何改变。事实上,我的“选择”方法正在做另一种方式绑定(通过恢复相关的产品选择)。从那以后,我找到了一些提示。我有一个解决方法,通过在服务方法上设置超时(这非常糟糕)。所以也许 Angular 有时间先处理模型更改,然后处理服务更改?
      猜你喜欢
      • 1970-01-01
      • 2015-11-28
      • 2019-01-20
      • 2017-11-10
      • 2017-03-02
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      相关资源
      最近更新 更多