在Angular 5的子组件中与@Input绑定时,复选框的选中状态不会更新

Posted

技术标签:

【中文标题】在Angular 5的子组件中与@Input绑定时,复选框的选中状态不会更新【英文标题】:Checkbox's checked status doesn't get updated when binding with @Input inside child component in Angular 5 【发布时间】:2018-09-25 15:11:09 【问题描述】:

我正在尝试在子组件中呈现复选框,并根据复选框是否选中显示一些文本。

复选框根据来自父组件的输入属性值(选中)被选中或取消选中。

<input #checkInput type="checkbox" [checked]="checked" />

并使用以下代码显示激活或禁用的文本。

<span>
    <ng-container *ngIf="checkInput.checked">Active</ng-container>
    <ng-container *ngIf="!checkInput.checked">Disabled</ng-container>
</span>

父组件数据来自 API。因此,为了模拟一些延迟,我将 setTimeout 包装在父组件内并渲染表。表格行包含子组件选择器,如下所示。

<tbody>
      <tr *ngFor="let org of organisations">
        <td >org.id</td>
        <td>org.name</td>
        <td><app-child [checked]="org.active" checkedText="Active" uncheckedText="Disabled"></app-child></td>
        <td><a class="button secondary">Edit</a></td>
      </tr>
    </tbody>

我的期望是如果“checked”属性为真,即从父组件到子组件,子组件内复选框旁边的文本应该显示“活动”而不是“禁用”。然而,这并没有发生。最初加载时显示“已禁用”。

我创建了一个 plunker 来演示这种行为。任何人都可以告诉我为什么即使选中了复选框,初始加载的文本也会被禁用?

plunker 的链接:https://plnkr.co/edit/mqmVYdbMF9qGduQYLYXa?p=preview

谢谢。

【问题讨论】:

【参考方案1】:

输入元素上的[checked]@Input 不同,Change Detection 的值在更改[checked] 时不会触发。

解决方案 1: 您可以更改为使用[(ngModel)] 而不是[checked] 来解决问题。

<input #checkInput type="checkbox" [(ngModel)]="checked" />
<span>
  <ng-container *ngIf="checkInput.checked">checkedText</ng-container>
  <ng-container *ngIf="!checkInput.checked">uncheckedText</ng-container>
</span>

解决方案 2: 在仍然使用 [checked] 的同时手动触发 change detection AfterViewInit 生命钩子。

import AfterViewInit, ChangeDetectorRef from '@angular/core'

export class ChildComponent implements AfterViewInit 
  constructor(private cd: ChangeDetectorRef)  

  ngAfterViewInit() 
    this.cd.detectChanges();
  

【讨论】:

以上是关于在Angular 5的子组件中与@Input绑定时,复选框的选中状态不会更新的主要内容,如果未能解决你的问题,请参考以下文章

Angular @Input 绑定使用函数调用多次

从Angular 5中的子组件更新父布尔值

Angular 2父组件丢失来自子组件的输入绑定

从Angular 2中的子组件更新父组件属性

Angular 2 - NgFor 中与 NgModel 的 2 路绑定

带有@input属性的Angular 7双向绑定