javascript - ngModel 强制获取属性两次

标签 javascript angular typescript

我有一个简单的组件来显示项目列表。我有一个 ngfor 循环,里面有一个带有 [(ngModel)] 的复选框。一切都按预期进行。

<div *ngFor="let armor of armorList">    
    <input type="checkbox" [(ngModel)]="armor.obtained"  />
    <span>{{armor.name}}</span>
</div>

我创建了一个名为 name 的 get 属性,如下所示。 (我只是为了示例而删除了实现本身)

 get name(): string {
        console.log("test");
        return "test";
    }

我认为奇怪的是,如果我单击列表中一项的复选框,则列表中的所有项目都会调用此 get 属性两次。我认为根本不应该调用它,因为我只是更新一项的一项属性,与其余项无关。

https://plnkr.co/edit/KqDpuw1QeXOCFNODbqiW?p=preview 我已经创建了上面的示例。如果单击其中一个复选框,您可以看到“test”在控制台上显示了 6 次。

有什么想法吗?

问候

狮子座

最佳答案

这是因为 Angular 在更新 View 后再次重新检查模型以验证它没有更改。这样做是为了确保模型的稳定性,并且更新 View 不​​会再次更新模型并启动无限循环。如果 Angular 发现更新后模型发生了变化,则会抛出 ExpressionChangedAfterItHasBeenCheckedError 错误。

请注意,这只发生在开发模式下。

进一步阅读:see this article

关于javascript - ngModel 强制获取属性两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521139/

相关文章:

javascript - 在基本的 javascript for 循环中,++i 和 i++ 有什么区别,我应该使用哪个

javascript - 是否可以有一个复合 ng2-charts 条形图和折线图?

typescript - 如何使用通用对象和键类型作为字典中的键

reactjs - 扩展和覆盖接口(interface)属性

javascript - ASP.NET MVC 中的日期格式设置

javascript - 如何检查 Jquery UI 对话框中的复选框值

javascript - 第二个 Wordpress Ajax 未触发

node.js - 构建 :Cannot find type definition file for 'node'

angular - Angular 5中的分页索引号

angular - 没有 OktaAuth 的提供者但 OktaAuth 定义?