在這個簡單的Angular2部件請看:如何髒檢查Angular2中的可迭代組件屬性?
@Component({
selector: 'status-area',
directives: [],
template: require('./status-area.tpl.jade')
})
export class StatusAreaComponent {
constructor(private _settings: SettingsProvider) {}
get items() {
return _.filter(this._settings.features, (feature: any) => {
return feature.inStatusBar && feature.isEnabled;
});
}
}
SettingsProvider有一個屬性特徵,這是由另一組件(例如SettingsPanel)改性。這些組件僅通過服務鏈接(無輸入參數)。
因此,正如您所看到的,我只需要從_settings.features屬性中只提取並標記爲狀態欄兼容功能。
爲此,我使用lodash方法查找。
然而,正如你可能已經猜到,角投在開發模式下的例外:它檢查
這是因爲_.filter()
每次穿過返回數組的新實例後
表達發生了變化,但收集是一樣的。
我的問題是,你是如何解決這種情況的?或者可能有另一種解決方案/方法來處理這種情況。
在我看來,這將是如果angular2有特殊裝飾一樣,非常有用:
@checkIterable() get items() { return _.filter(this._settings.features, (feature: any) => { return feature.inStatusBar && feature.isEnabled; }); }
我當然可以用另一種方法,事件和事件監聽器解決這個問題,但它產生了很多的樣板代碼。
看看這個例子:
export class StatusAreaComponent implements OnInit, OnDestroy { protected _items; protected _removeWatcherFn; constructor(private settings: SettingsProvider) {} ngOnInit() { this._items = this._fetchItems(); this._removeWatcherFn = this.settings.onChange.bind(() => { this._items = this._fetchItems(); }); } ngOnDestroy() { this._removeWatcherFn(); } _fetchItems() { return _.filter(this.settings.features, (feature: any) => { return feature.inStatusBar; }); } get items() { return this._items; } }
這樣角是幸福的,但我不知道。
好的解決方案!我試圖使用memoize,但我嘗試了錯誤的方式。我沒有提供緩存鍵功能。 –