sso*_*nez 5 store rxjs angular
我使用 a 开发了一个自定义角度商店,BehaviorSubject并且使用如下:
export class UserFaceComponent {
@Input()
public id: any;
public presence$: Observable<boolean>;
constructor(private _store: Store) { }
public ngOnInit() {
this.presence$ = this._store
.select(s => s.users.presences)
.pipe(
map(p => p.includes(this.id))
);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,当存储更改时,presence$可观察对象会发出新值。它工作得很好,但是,id传递给组件的也可能会改变。假设页面上有一个用户列表,当用户选择其中一个时,它会更新传递selectedUserId给UserFaceComponent. 这将是与以前相同的组件,但id会更新。
这意味着我必须在组件中创建一个主题,订阅钩子onChange并在 id 更改时发出该主题。然后,我必须将此可观察值与上面的可观察值合并,然后发出新值。
这可行,但非常麻烦,我不想被迫为用这种方法制作的每个组件执行此操作...我考虑了一段时间,但我找不到另一个解决方案来解决这个问题...
我多次遇到相同的要求,不幸的是没有比您的方法更简单的解决onChange方案subject。我曾经读到过有人提出装饰器的建议ObservableInput,但从未实施。
除了您的方法之外,还有另一种方法可以做到这一点,它并不是更简单,只是不同。这种替代方法使用输入 getter 和 setter 而不是ngOnChanges生命周期挂钩来更新主题。
private _id: BehaviorSubject<string> = new BehaviorSubject<string>();
@Input()
set id(value: string) {
this._id.next(value);
}
get id(): string {
return this._id.value;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |