在这个简单的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,但我尝试了错误的方式。我没有提供缓存键功能。 –