【发布时间】:2016-02-13 08:45:12
【问题描述】:
看看这个简单的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 有一个属性features,它被另一个组件(例如 SettingsPanel)修改。此组件仅通过服务链接(无输入参数)。
所以,正如您所见,我只需要从 _settings.features 属性中获取已启用并标记为状态栏兼容的功能。
为此,我使用 lodash 方法查找。
不过,你可能猜到了,angular 在开发模式下会抛出异常:
检查后表达式发生了变化
这是因为_.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;
}
}
这样 Angular 很高兴,但我不高兴。
【问题讨论】:
标签: typescript angular