【发布时间】:2016-10-13 03:23:20
【问题描述】:
目前,我的 DOM 对象如下所示:
<div *ngIf="checkCam1Exists()">
<app-counter [index]="1"></app-counter>
</div>
在组件中,函数“checkCam1Exists()”如下所示:
checkCam1Exists(){
console.log("checkCam1ran");
if(this.cameraService.camera1 == null){
return false;
}
else{
return true;
}
}
其中cameraService是注入到组件构造函数中的服务,camera1是cameraService中的一个对象。
我的问题在于让 ngIf 再次运行。 camera1 对象是从另一个服务(发出 HTTP 请求的 dataService)中更新的。如何触发 ngIf 再次运行?
我已阅读以下帖子: Triggering Angular2 change detection manually - 但 Angular 文档中提供的示例似乎并未涵盖如何检查组件类之外的变量(我需要检查服务变量)。
编辑
我设法让自动更改检测工作使用:
constructor(private ref: ChangeDetectorRef, private cameraService: CameraService, private toolbarService: ToolbarService) {
ref.detach();
setInterval(() => {
this.ref.detectChanges();
}, 5000);
}
虽然这感觉是一种非常低效的方法。如何手动触发变更检测?
编辑 2
在 Lucas Tétreault 的帮助下,我想我可能会超出 Angular 2 区域的初始点击事件,因为与应用程序的任何交互(在初始点击事件之后)都会导致 ngIf 检测到更改并重新开始工作. 我的问题必须在这里:
map.data.addListener('click', (event) => {
var mapElement = event.feature.getProperty('type');
switch(mapElement){
case 'classifiedroads':
var roadnumber = event.feature.getProperty('roadID');
map.data.revertStyle();
map.data.overrideStyle(event.feature, {
strokeWeight: 8
});
this.roadService.roadClicked(roadID);
break;
case 'cameras':
var cameraID = event.feature.getProperty('trafficID');
this.cameraService.cameraClicked(cameraID); //camera is initialised at this stage.
break;
default:
break;
}
});
我有一个使用 JavaScript 导入的 Google Map 对象(我被警告过的 Angular2 Google Map 项目存在限制,这就是我不使用它的原因)。此点击事件必须在 Angular 2 区域之外,当我点击应用程序上的其他位置时,我会重新进入 Angular 2 区域并且 ngIf 更改检测会再次启动。
有没有办法手动强制 ngIf 更改检测?
【问题讨论】:
标签: angular angular-ng-if