Angular 使用可观察存储和具有角度的组件输入

Angular 使用可观察存储和具有角度的组件输入,angular,rxjs,store,Angular,Rxjs,Store,我使用BehaviorSubject开发了一个定制的angular store,我的使用方式如下: export class UserFaceComponent { @Input() public id: any; public presence$: Observable<boolean>; constructor(private _store: Store) { } public ngOnInit() { this.p

我使用
BehaviorSubject
开发了一个定制的angular store,我的使用方式如下:

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))
            );
    }
}
导出类UserFaceComponent{
@输入()
公共id:任何;
公众存在:可见;
构造函数(私有_存储:存储){}
公共ngOnInit(){
this.presence$=this.\u商店
.select(s=>s.users.presence)
.烟斗(
map(p=>p.includes(this.id))
);
}
}
这样,当存储更改时,
presence$
observable将发出一个新值。它工作得很好,但是传递给组件的
id
也可能会改变。假设页面上有一个用户列表,当用户选择其中一个时,它会更新一个变量
selectedUserId
,该变量被传递到
UserFaceComponent
。这将是与以前相同的组件,但将更新
id

这意味着我必须在我的组件中创建一个主题,订阅
onChange
hook,并在id更改时发出关于这个主题的消息。然后,我必须将这个可观测值与上面的一个合并,然后发出新的值


这将是可行的,但它是相当麻烦的,我不想被迫这样做的每个组件与此方法。。。我考虑了一段时间,但我找不到另一个解决方案来解决这个问题…

我多次遇到相同的需求,不幸的是没有比您的
onChange
-
主题
方法更简单的解决方案。我曾经读到有人建议使用
observeibleInput
decorator,但它从未实现过

除了你的方法之外,还有另一种方法可以做到这一点,它并不简单,只是不同而已。这种替代方法使用输入getter和setter,而不是
ngOnChanges
lifecycle挂钩来更新主题

private _id: BehaviorSubject<string> = new BehaviorSubject<string>();
@Input()
set id(value: string) {
  this._id.next(value);
}
get id(): string {
 return this._id.value;
}
private\u id:BehaviorSubject=new BehaviorSubject();
@输入()
设置id(值:字符串){
此._id.next(值);
}
获取id():字符串{
返回此值。\u id.value;
}

如果使用
async
管道订阅,则可以为变量分配一个新的可观察变量。
async
管道自动取消订阅其当前可观察对象,并在您为其输入分配新可观察对象时订阅新可观察对象

导出类UserFaceComponent{
@输入()
公共id:任何;
公众存在:可见;
构造函数(私有_存储:存储){}
ngOnChanges(更改:SimpleChanges){
如果(更改['id']){
const currentId=更改['id']。currentValue
this.presence$=this.\u商店
.select(s=>s.users.presence)
.烟斗(
映射(p=>p.includes(currentId))
);
}
}
}
{{presence$| async}

这不完全是我想要的答案(我希望有一个神奇的解决方案,呵呵),但这个版本比我的短。谢谢