我在我的 angular2 应用程序中遇到了一个非常有趣的问题,我在这里简化了情况。
这是 AppComponnet
export class AppComponent {
tabs: any = [];
viewModes = [
{ label: "列表查看"},
{ label: "树状图" },
];
constructor(private changeRef: ChangeDetectorRef) {}
addTab() {
var worker = new Worker("worker.js");
worker.postMessage("");
worker.onmessage = (event) => {
this.tabs.push({
label: 'label'
})
this.changeRef.detectChanges();
}
}
currentMode: any;
selectViewMode(mode: any) {
if (this.currentMode) {
this.currentMode.selected = false;
}
mode.selected = true;
this.currentMode = mode;
}
}
这是模板
<div *ngFor="let tab of tabs">
<ul>
<li *ngFor="let item of viewModes">
<a (click)="selectViewMode(item)" [style.background]="item.selected ? '#f69c55' : ''"> {{item.label}} </a>
</li>
</ul>
</div>
<button (click)="addTab()">Add Tab</button>
工人完成后,我将一个新标签推送到标签。并且 Angular2 在 Worker onmessage 回调之后不会进行更改检测,我必须手动触发更改检测。
但是在那之后,点击后添加的选项卡中列表的背景不会改变(回调函数被执行,所以改变检测不起作用)。
如果我执行其他操作,例如再次单击“添加选项卡”按钮,更改检测将起作用并按预期设置列表背景。
如果我不手动触发更改检测。按下选项卡后,执行其他操作(例如再次单击按钮)以触发更改检测。现在列表将显示,并且背景更改效果很好。
我知道关键是在 Worker 执行后手动调用更改检测,但我不知道详细发生了什么导致列表背景更改检测不起作用。