有没有办法订阅部分BehaviorSubject值的变化?

Van*_*ssa 2 rxjs angular

假设我有一个行为主体,其值由具有两个属性的对象组成。有没有一种方法可以仅订阅基础值的一个属性的更改?

export interface MyObject {
  property1: string,
  property2: string
};
const subject = new BehaviorSubject<MyObject>({
  property1: 'test',
  property2: 'test'
});
subject.next({
  property1: 'test',
  property2: 'test2'
});
subject.subscribe(value => {
  // how to only fire for changes on property2?
});
Run Code Online (Sandbox Code Playgroud)

Nic*_*wer 5

您可以使用distinctUntilChanged运算符,并传入一个函数来描述什么算作相等。如果两个连续值相等,则第二个值将被过滤掉:

subject.pipe(
  distinctUntilChanged((prev, curr) => prev.property2 === curr.property2)
).subscribe(value => {
  // do stuff
})
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用distinctUntilKeyChanged:

subject.pipe(
  distinctUntilKeyChanged('property2')
).subscribe(value => {
  // do stuff
})
Run Code Online (Sandbox Code Playgroud)

上面的例子仍然会输出整个对象。如果您只想输出属性 2,则可以映射到该属性,并再次使用 uniqueUntilChanged,尽管您不需要自定义相等函数

subject.pipe(
  map(value => value.property2),
  distinctUntilChanged(),
).subscribe(property2 => {
  // do stuff
})
Run Code Online (Sandbox Code Playgroud)