Angular-ChangeDetection策略和订阅

时间:2018-08-22 09:51:02

标签: angular observable angular2-changedetection

我对Angular很陌生,我想了解一些东西。

我有一个我们保留的项目:

 changeDetection: ChangeDetectionStrategy.OnPush

因此,如果我想保留changeDetection onPush,应该如何解决此问题: 我在视图中有一个对象列表,当您将鼠标悬停在一个对象上时,有一个(mouseover)函数将next()发送到BehaviourSubject,我订阅了该函数以获取悬停的对象。 如果我将带有此订阅的控制台日志放在控制台中,则将鼠标悬停在控制台中时,我将看到更新的对象。

但是,如果我的组件中包含以下内容:

...
hoveredObject: ObjectType;

ngOnInit() {
  mySubscription.subscribe(s => {
  this.hoveredObject = s;
  });
}
...

在这种情况下,只会在视图上显示我悬停的第一个值,而不会在我悬停的另一个值上显示,如果我删除了onPush changeDetection,该值将得到固定。

但是如何在不删除的情况下克服它? 我了解这是因为该对象是参考,因此未检测到更改, 我尝试过类似的事情:

mySubscription.subscribe(s => {
  this.hoveredObject = { 
    id: s.id,
    name: s.name
  };

但是它不起作用,并且我收到错误消息,无法读取undefined的名称,这是因为最初当您不将鼠标悬停在任何内容上时,BehaviourSubject会返回undefined

如何使Angular知道这里有更改并更新视图?

在该视图中,我有一个div:{{hoveredObject}}

谢谢

1 个答案:

答案 0 :(得分:3)

仅当我们在谈论父/子组件通信时,OnPush才有意义。当孩子具有changeDetection时:ChangeDetectionStrategy.OnPush设置,并且父母将对象作为输入传递给孩子。

如果要处理具有自己状态的组件中的事件。最好避免使用onPush。如果要使用,可以使用cdr.markforCheck()手动调用更改检测。