Angular 角度:替换类实例会导致数据绑定失败
角度10 这是我在很多情况下遇到的一个一般性问题,最好能绕开它 我通常在页面上创建一个类实例,并将其分配给一个变量。e、 gAngular 角度:替换类实例会导致数据绑定失败,angular,typescript,Angular,Typescript,角度10 这是我在很多情况下遇到的一个一般性问题,最好能绕开它 我通常在页面上创建一个类实例,并将其分配给一个变量。e、 g this.myProject:Project=newproject() 然后将其绑定到页面元素: 并弹出模式窗口,更新this.myProject它不会一直绑定到模式窗口,原始属性保持不变 我假设这是因为我实际上用一个全新的对象替换了this.myProject在内存中引用的对象。如果我逐个更新属性,则绑定工作正常。然而,对于复杂的类结构,这显然是不切实际的 我找到了一个
this.myProject:Project=newproject()代码>
然后将其绑定到页面元素:
并弹出模式窗口,更新this.myProject
它不会一直绑定到模式窗口,原始属性保持不变
我假设这是因为我实际上用一个全新的对象替换了this.myProject
在内存中引用的对象。如果我逐个更新属性,则绑定工作正常。然而,对于复杂的类结构,这显然是不切实际的
我找到了一个函数,它似乎是更新对象而不是替换对象,并传播更改
merge(this.myProject,一个更新的项目类实例)代码>
这是一个好的/正确的解决方案吗?
首先要考虑的事情是<代码> MyStudio过载过多的责任?可以从将这些关注点拆分为不同的对象/输入变量开始,这些对象/输入变量将在最短的必要时间内正确触发更改检测
至于触发复杂对象的更改检测,您有几个选项
克隆对象以创建新引用
#使用扩展运算符
this.myProject={…一个更新的项目类实例};
#使用对象分配
this.myProject=Object.assign({},一个更新的项目类实例);
使用可观察的
this.myProject$=newbehaviorsubject(newproject());
模板:
更新:
this.myProject$.next(更新的项目类实例);
手动触发更改检测
构造(私有cd:ChangeDetectorRef){
someMethod(){
this.cd.detectChanges();
}
在stackblitz上,如果看不到最低限度的复制,就很难说出问题出在哪里。一般来说,如果您使用的是@Input
/@Output
(而不是使用OnPush策略),则ChangeDetection应该注意这一点。此外,不应强制您更改属性,而应指定新对象。因此,您应该在代码中查找潜在问题,而不是使用一些奇怪的解决方法。是的。这就是我问的原因。我想找到问题的根本原因。我已经从ng引导中派生了演示,并添加了计时器,在模式显示且一切正常后更改引用-请参阅。如果您希望我们帮助您找到您的问题,请在stackblitz上提供最低限度的复制,我们将从那里开始工作。谢谢。这里有一些有趣的方法。谢谢。如果我的回答有用的话,请你投票或者接受我的回答好吗?谢谢。我投了更高的票。但它并没有完全回答我的问题。是我替换对象而不是更新对象这一事实导致了数据绑定失败。看来是这样。非常感谢。