Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.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_Rxjs_Angular9_Rxjs Observables - Fatal编程技术网

Angular 从角度模板多次调用方法

Angular 从角度模板多次调用方法,angular,typescript,rxjs,angular9,rxjs-observables,Angular,Typescript,Rxjs,Angular9,Rxjs Observables,我使用模板中的方法调用函数,该函数返回布尔值。问题是函数被调用了6次以上。之后,我使用了changeDetectionStrategy.onPush,将调用次数减少到2倍。下面是我的代码 HTML <div *ngIf="(checkboolObs(check$)) | async"></div> TS check$: Observable<service> = this.data.getresponse(); ngOnInit()

我使用模板中的方法调用函数,该函数返回
布尔值。问题是函数被调用了6次以上。之后,我使用了
changeDetectionStrategy.onPush
,将调用次数减少到2倍。下面是我的代码

HTML

<div *ngIf="(checkboolObs(check$)) | async"></div>

TS

check$: Observable<service> = this.data.getresponse();

ngOnInit() {
  this.checkboolObs();
}
checkboolObs(style):boolean {
  return somestyleIDS.includes(style.component)
}
check$:Observable=this.data.getresponse();
恩戈尼尼特(){
this.checkboolObs();
}
checkboolObs(样式):布尔值{
返回someStyleId.includes(style.component)
}

如果找到该值,它将返回
true
,但它会被调用多次,我只需要调用一次。这背后的原因是导航时有几次不会触发
checkboolobs()
,这就是我从模板调用此方法的原因。

这是正常的,因为每次调用更改检测循环时,它都会评估模板,并且您的函数是模板的一部分,因此该函数将被重新评估(再次调用)

简要说明角度变化检测是如何工作的

假设每次有可能导致任何更改的事件(例如单击、某些时间间隔正在做某事、ajax调用)Angular都会立即获取模板并为您重新计算它(换句话说,更新HTML)

当您使用
onPush
策略时,您基本上是在告诉angular停止监听所提到的任何更改,因为您将负责在发生更改时告诉框架。 **免责声明我们有可以在模板中使用的
| async
,它可以与
onPush
策略配合使用,如果您的输入按引用更改,将触发更改检测,但正如我所说,这是一个简要的解释

因此,您可以做的事情是(我假设您是从
检查$
observable中获取ID)

然后在模板中使用
myCheck$
|async


如果这不起作用,请更详细地解释您的用例。

我看不到可观察的
检查$
与代码其余部分有任何联系<代码>checkboolObs
不是一个observable@MoxxiManagarm请立即检查,您仍然使用
checkBoolObs
上的异步管道,该管道返回
布尔值,而不是
可观察值。我不明白这里是怎么涉及到
检查$
的。另外,这篇文章可能会对你有所帮助
myCheck$ = this.check$.pipe(map(arrayOfIds => arrayOfIds.includes(style.component)))