Javascript Rxjs:Behavior Subject在不调用next()的情况下发出值
我正在用RxJs创建一个多选过滤器,并使用angular服务在组件之间传递值Javascript Rxjs:Behavior Subject在不调用next()的情况下发出值,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我正在用RxJs创建一个多选过滤器,并使用angular服务在组件之间传递值 @Injectable({ providedIn: 'root' }) export class SomeService{ private readonly defaulFilterSelect: SomeSelect[] = [ { id: 1, label: 'label 1', options: [
@Injectable({
providedIn: 'root'
})
export class SomeService{
private readonly defaulFilterSelect: SomeSelect[] =
[
{
id: 1,
label: 'label 1',
options: [
{ id: 2, isChecked: false},
{ id: 3, isChecked: false}
]
},
{
id: 7,
label: 'Label 2',
type: { name: 'checkbox' },
options: [
{ id: 4, isChecked: false},
{ id: 5, isChecked: false}
]
}
]
private filterSelectDataSource = new BehaviorSubject<SomeSelect[]>(this.defaulFilterSelect);
filterSelectData$ = this.filterSelectDataSource.asObservable();
public get getFilterSelectData(){
return this.filterSelectDataSource.value;
}
}
由于某些原因,这并不像我预期的那样工作,当我在订阅上登录控制台时,我会得到我的可观察值的先验值。
此外,如果我修改对象this.filterSelectDataSource.value,而不调用next(obj)
,UI将侦听更改并呈现更改,这对我来说非常混乱,因为我希望只调用this.filterSelectDataSource.next(someNewObject)
将触发用户界面中的更改,这些更改将使用可观察到的内容。
有人能给我指一下正确的方向吗?谢谢 当您在
filterSelectDataSource
上将其设置为初始值时,需要深度克隆DefaufilterSelect
,否则当您更新它时,您正在更新与DefaufilterSelect
相同的引用
如何进行深度克隆取决于您,但我通常使用Lodash。请查看我的答案。如果没有next().1),您不应该修改源代码。仅getValue()(而不是.value)2)下一步()3)您的组件代码正确吗?变化检测?订阅等等,谢谢@an的洞察力谢谢!我不知道
uncheckAllOptions(){
this.filterSelectDataSource.next(this.defaulFilterSelect); //here
}