Angular - ChangeDetectionStrategy 和订阅

Angular - ChangeDetectionStrategy and subscription

我是 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 returns undefined.

我怎样才能让Angular知道这里有变化并让它更新视图?

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

谢谢

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

如果你想在有自己状态的组件中处理事件。最好避免使用 onPush。如果要使用,可以手动使用cdr.markforCheck()手动调用Change detection。