首页 文章

设置变量时Angular ngModel不更新

提问于
浏览
0

我使用的是Angular 4和Typescript,我的模板中有一个 <select> 的表:

<tr *ngFor="let task of tasksDetails">
    <td>{{task.name}}</td>
    <td>
        <select class="form-control" [(ngModel)]="task.uiMetadata.worker">
            <option value="">Select worker</option>
            <option *ngFor="let worker of workers" [value]="worker.resource.id">{{worker.resource.name}}</option>
        </select>
    </td>
</tr>

在另一个组件中,我能够添加/删除到employees列表,并输出到 Subject ,该组件订阅:

this.workerRemoved.subscribe(worker => {
    _each(this.tasksDetails, taskTemplate => {
        if (taskTemplate.uiMetadata.worker === member.resourceId) {
            taskTemplate.uiMetadata.worker = '';
        }
    });
});

问题是,当订阅更新变量中的字段时,ngModel不会接收更改并在UI中反映它 .

Chrome DevTools output

因此,我们最终会遇到 ng-reflect-model 显示"11"的情况,worker变量是一个空字符串,并且select显示为空白,因为"11"选项已被删除 .

如何让Angular保持模型与我在订阅中所做的更改保持同步?我已经尝试将其包装在 NgZone.run() 中并且还调用 ChangeDetectorRef.detectChanges() ,但两者都不会更新 ng-reflect-model 值 .

Here is a Plunker reproducing the error

1 回答

  • 1

    我找到了解决方案,感谢yurzui指出我正确的方向:

    if (taskTemplate.uiMetadata.worker === member.resourceId) {
    

    改变为

    if (+taskTemplate.uiMetadata.worker === +member.resourceId) {
    

    所以严格的平等就是比较数字 . 表单输入将值转换为字符串 . 有时容易的人可以得到你 .

相关问题