distinctUntilChanged 设置初始值
distinctUntilChanged set initial value
对于rxjs,我可以在使用distinctUntilChanged
时提供一个初始值吗?当没有收到以前的值时,似乎完全跳过了 equals 检查。当它收到的第一个值是初始值时,我不想发出任何东西。
用例
在我的例子中,我正在使用 angular,我正在使用响应式表单并订阅其值更改。因为它是一个输入字段,所以我有一个典型的管道设置:
debounceTime(350)
distinctUntilChanged()
当用户将初始字段从空更改为某个内容然后在去抖动时间内再次为空时,事件无论如何都会被触发,这是不应该发生的。
我试过的
- 在
distinctUntilChanged
中提供自定义 equals 方法
- 不工作,因为管道在第一次遇到时被完全跳过
- 使用默认值对基础主题强制执行
next
- 这仍然会在我宁愿避免的去抖时间后发出一个值
您可以使用 skip
to skip the first emit or skipWhile
只跳过初始值。
obs.pipe(
debounceTime(350),
distinctUntilChanged(),
skipWhile(value => value === initialValue) // or skip(1)
)
你可以试试startWith:
const valueChanges$ = this.form
.get('CONTROL_NAME')
.valueChanges
.pipe(
startWith('INITIAL_VALUE'),
distinctUntilChanged(),
skip(1)
)
.subscribe((value: string) => { ... });
使用 startWith
或 skipWhile
运算符不起作用,正如评论所证实的那样。
我简单地使用 skip(1)
:
解决了
const valueChanges$ = this.form
.get('CONTROL_NAME')
.valueChanges
.pipe(
skip(1)
distinctUntilChanged(),
)
.subscribe((value: string) => { ... });
对于rxjs,我可以在使用distinctUntilChanged
时提供一个初始值吗?当没有收到以前的值时,似乎完全跳过了 equals 检查。当它收到的第一个值是初始值时,我不想发出任何东西。
用例
在我的例子中,我正在使用 angular,我正在使用响应式表单并订阅其值更改。因为它是一个输入字段,所以我有一个典型的管道设置:
debounceTime(350)
distinctUntilChanged()
当用户将初始字段从空更改为某个内容然后在去抖动时间内再次为空时,事件无论如何都会被触发,这是不应该发生的。
我试过的
- 在
distinctUntilChanged
中提供自定义 equals 方法- 不工作,因为管道在第一次遇到时被完全跳过
- 使用默认值对基础主题强制执行
next
- 这仍然会在我宁愿避免的去抖时间后发出一个值
您可以使用 skip
to skip the first emit or skipWhile
只跳过初始值。
obs.pipe(
debounceTime(350),
distinctUntilChanged(),
skipWhile(value => value === initialValue) // or skip(1)
)
你可以试试startWith:
const valueChanges$ = this.form
.get('CONTROL_NAME')
.valueChanges
.pipe(
startWith('INITIAL_VALUE'),
distinctUntilChanged(),
skip(1)
)
.subscribe((value: string) => { ... });
使用 startWith
或 skipWhile
运算符不起作用,正如评论所证实的那样。
我简单地使用 skip(1)
:
const valueChanges$ = this.form
.get('CONTROL_NAME')
.valueChanges
.pipe(
skip(1)
distinctUntilChanged(),
)
.subscribe((value: string) => { ... });