使用getter函数时,Angular 9模板在鼠标单击时重新订阅Observable

使用getter函数时,Angular 9模板在鼠标单击时重新订阅Observable,angular,typescript,Angular,Typescript,我刚刚花了很长时间调试了一个我不理解的问题。 基本上,每次我在我的页面上点击一个按钮或任何带有点击事件的东西时,一个特定组件的模板都会重新订阅一个可观察的组件,即使在点击页面上不相关的组件时也是如此 注意:我的所有组件也使用OnPush更改检测 在我的Angular 9组件中,我有下面一段代码 请注意,这是一个getter函数 public get riskFactorModel(): Observable<ModelBuilderModel> { return this.m

我刚刚花了很长时间调试了一个我不理解的问题。 基本上,每次我在我的页面上点击一个按钮或任何带有点击事件的东西时,一个特定组件的模板都会重新订阅一个可观察的组件,即使在点击页面上不相关的组件时也是如此

注意:我的所有组件也使用OnPush更改检测

在我的Angular 9组件中,我有下面一段代码

请注意,这是一个
getter
函数

public get riskFactorModel(): Observable<ModelBuilderModel> {
    return this.model('riskFactors').pipe(map(riskFactors => {
      // Do stuff here 
    }));
  }
public get riskFactorModel():可观察{
返回此.model('riskFactors').pipe(map(riskFactors=>{
//在这里做事
}));
}
在我的模板中我有这个

<div *ngIf="(riskFactorModel | async) let _riskFactor">
        <div class="errors" *ngIf="_riskFactor.modelErrors && _riskFactor.modelErrors.length > 0">
          <div *ngFor="let error of _riskFactor.modelErrors">
            {{error.message}}
          </div>
        </div>
      </div>

{{error.message}}
我所做的就是将可观察对象移动到组件上的一个属性,就像这样

export class RiskFactorsBuilderComponent extends ComponentBase implements OnInit, OnDestroy {
      
    public riskFactorModel: Observable<ModelBuilderModel>;
    
      constructor() {
        super();
      }
    
      public ngOnInit(): void {
        this.riskFactorModel = this.getRiskFactorModel();
      }
    
      public getRiskFactorModel(): Observable<ModelBuilderModel> {
        return // do getObservable stuff here 
    }
}
导出类RiskFactorsBuilderComponent扩展了ComponentBase在nit、OnDestroy上实现的组件{
公共风险因素模型:可观察;
构造函数(){
超级();
}
public ngOnInit():void{
this.riskFactorModel=this.getRiskFactorModel();
}
public getRiskFactorModel():可观察{
return//dogetobservable在这里
}
}
而现在,对可观测的不断重新订阅已经停止了?!?!有人能给我解释一下为什么,这对我来说就像是一只有棱角的虫子


提前感谢

每次运行更改检测周期时,您的getter都会被调用,并提供了一个新的可观察对象,您也在订阅。将可观察对象放在属性中是绕过它的唯一方法(我知道)。
另一个问题是,如果您有OnPush策略,为什么您的更改检测会运行。而且,
getter
仍然是一个被调用的函数,现在它与属性相同

每次运行更改检测循环时,您的getter都会被调用,并提供一个新的可观察的对象,您也在订阅。将可观察对象放在属性中是绕过它的唯一方法(我知道)。
另一个问题是,如果您有OnPush策略,为什么您的更改检测会运行。而且,
getter
仍然是一个被调用的函数,它现在与属性相同

请在某个地方制作一些原型,这是我表示您的问题的最佳方式,以便其他人快速进入问题并给出解决方案you@Jadli请看我的帖子。我已经找到了解决方案,我只是不明白。请在某个地方做一些原型,这是我表示您的问题的最佳方式,以便其他人快速进入问题并给出解决方案you@Jadli请看我的帖子。我已经找到了解决方案,但我不明白,我知道所有的getter和setter都是函数。那么,如果我将其转换为属性,问题为什么会消失呢?属性值是一个对象,angular可以将上一个更改检测周期中的对象引用与当前的对象引用进行比较,如果它们相同,则不会重新提交相应的html。您的getter函数在每次更改检测运行时都提供了一个新的可观察实例,因此问题我理解所有getter和setter也是函数。那么,如果我将其转换为属性,问题为什么会消失呢?属性值是一个对象,angular可以将上一个更改检测周期中的对象引用与当前的对象引用进行比较,如果它们相同,则不会重新提交相应的html。getter函数在每次更改检测运行时都提供了一个新的可观察实例,这就是问题所在