【发布时间】:2017-07-17 19:41:13
【问题描述】:
我有以下情况:
组件@permissions 这个组件有一个按钮,可以触发一个简单的承诺并在我的另一个组件上设置一个值@MenuComponent
export class Permissions {
constructor(private _menu: MenuComponent, private _api: ApiService) {}
btnAction(){
this._api.getDataID(item.project_name, 'usersbyID', userID).then((data: any) => {
this._menu.checkPerm(JSON.parse(data.permissions).description);
});
}
}
返回什么并不重要,但它是一个简单的 JSON。
在我的另一个组件@MenuComponent
@Component({
// ..another configuration non relevant
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class MenuComponent implements OnInit {
menus = []
menuPermisson: any;
menuObservable = new Subject();
constructor(private _cdRef: ChangeDetectorRef) {
this.menuObservable.subscribe(value => {
this.menuPermisson = value;
this.reloadAll();
});
}
reloadAll() {
this.menus.push('someValue');
this._cdRef.markForCheck();
}
checkPerm(data) {
this.menuObservable.next(data);
}
}
所以这个概念是在承诺向我的主题发送一些值之后,我需要将 someValue 推送到菜单,直到此时所有数据都可以到达那里,但我需要重新渲染视图,以便“someValue”显示在风景。但它什么也没做,当我将this._cdRef.markForCheck() 更改为this._cdRef.detectChanges() 并将其放在tryCatch 上时,它会返回Attempt to use a destroyed view: detectChanges。我找不到使用 someValue 呈现菜单的方法。
这两个组件在 ChangeDetection 树上处于同一级别
【问题讨论】:
标签: angular typescript angular2-components angular2-changedetection