出於性能方面的原因,我試圖在我的組件上設置手動更改檢測。Angular2可觀察的更改檢測模板更新
該應用的結構:應用程序 - >書(S) - >網頁(S)
予訂閱可觀察到的在AppComponent,我然後運行ChangeDetectorRef的 「markForCheck」 的方法。
這似乎觸發了BookComponent(我標記爲更新的組件的子節點)中的ngAfterContentChecked方法。
這讓我相信父組件中的「markForCheck」也更新了所有的孩子。
但是,即使ngAfterContentChecked在子項(BookComponent)中執行,該組件的模板也不會更新!
我應該聽每個孩子的觀察值(有時在組件層次結構中有幾個層次)?還是我做錯了什麼?爲什麼ngAfterContentChecked在子組件中執行,即使模板沒有更新?
一些相關的代碼。
@Component({
selector: 'app',
directives: [BookComponent],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<book *ngIf="_book" [book]="_book" [style.height]="_availableDimensions.height+'px'" (window:resize)="onResize($event)"></book>
<footer id="footer"></footer>
`
})
export class PlayerComponent {
ngOnInit() {
this.initScale();
}
initScale(){
this._playerService.availableDimensions$.subscribe(
availableDimensions => {
// set local availableDimensions variable
this._availableDimensions = availableDimensions;
this._cd.markForCheck();
}
);
}
}
@Component({
selector: 'book',
directives: [PageComponent],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div id="pageScrollZone">
<div id="pageHolder" [ngStyle]="pageHolderStyles()"></div>
</div>
`
})
export class BookComponent {
constructor(
private _cd: ChangeDetectorRef,
private _playerService: PlayerService,
private _config: Config
){}
ngAfterContentChecked(){
// This part does execute when the observable changes
let date = new Date();
console.log('BOOK: '+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds());
}
pageHolderStyles(){
// This part does NOT execute when the observable changes
let styles = {
marginTop: this._currentMargin.y+'px',
transform: 'scale('+ (this._baseZoom * this._currentZoomLevel) +')'
}
return styles;
}
}
單詞很便宜 - 向我們展示一些代碼;-)理想情況下,一個pl允許重現的未知者。 –