Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度:替换类实例会导致数据绑定失败_Angular_Typescript - Fatal编程技术网

Angular 角度:替换类实例会导致数据绑定失败

Angular 角度:替换类实例会导致数据绑定失败,angular,typescript,Angular,Typescript,角度10 这是我在很多情况下遇到的一个一般性问题,最好能绕开它 我通常在页面上创建一个类实例,并将其分配给一个变量。e、 g this.myProject:Project=newproject() 然后将其绑定到页面元素: 并弹出模式窗口,更新this.myProject它不会一直绑定到模式窗口,原始属性保持不变 我假设这是因为我实际上用一个全新的对象替换了this.myProject在内存中引用的对象。如果我逐个更新属性,则绑定工作正常。然而,对于复杂的类结构,这显然是不切实际的 我找到了一个

角度10

这是我在很多情况下遇到的一个一般性问题,最好能绕开它

我通常在页面上创建一个类实例,并将其分配给一个变量。e、 g

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上提供最低限度的复制,我们将从那里开始工作。谢谢。这里有一些有趣的方法。谢谢。如果我的回答有用的话,请你投票或者接受我的回答好吗?谢谢。我投了更高的票。但它并没有完全回答我的问题。是我替换对象而不是更新对象这一事实导致了数据绑定失败。看来是这样。非常感谢。