我正在编写一个角度应用程序,其中我的一个组件订阅了ngrx存储中的许多值。我的ngOnInit
函数如下所示:
this.store.pipe(select(searchResults), takeUntil(this.destroyed$))
.subscribe(results => this.searchResults = results);
this.store.pipe(select(searchError), takeUntil(this.destroyed$))
.subscribe(error => this.searchError = error);
// Lots of similar statements below
我认为这太冗长了。这也使得一眼就很难掌握哪些字段从商店中获取了它们的价值。我的直觉说,应该有可能以更简洁的方式编写此代码,例如下面的示例:
this.syncField(searchResults, 'searchResults');
this.syncField(searchError, 'searchError');
// Lots of similar statements below
这种方法依赖于我无法编写的syncField
方法。我尝试了以下方法:
syncField<T>(selector: MemoizedSelector<object, T>, field: keyof MyComponent) {
this.store.pipe(select(selector), takeUntil(this.destroyed$)).subscribe(value => {
this[field] = value;
});
}
但是,该组件具有一些只读字段,这会导致分配(this[field] = value
)失败,并显示以下消息:Cannot assign to [readonly field name] because it is a constant or a read-only property.
。
这引发了以下问题:
keyof T
来过滤掉只读属性?syncField
方法吗?