FormControl valueChanges.subscribe 与 keyup

FormControl valueChanges.subscribe vs keyup

一个简单的问题,以前没有想到。

我开始了一个项目并找到了代码:

<input (keyup)="someFunc($event)" [formControl]="someControl">

因为我在重构所有的表单,所以我的第一个想法是去掉(keyup)并使用someControl.valueChanges.subscribe(..),但是现在我有疑问了,因为如果我这样做,我只是在组件中添加了更多的代码(f.ex.import Subscription, OnDestroy 也取消订阅,然后someControl.valueChanges.subscribe)。所以与 keyup 相比,valueChanges.subscribe 增加了更多的代码。

它有什么我不知道的好处吗?

p.s。我知道,使用 keyup,它会在用户释放按钮时触发,而 valueChanges.subscribe 当用户按下按钮时触发。但就我而言,这种差异并不重要。

如果您使用 valueChanges,您也​​可以使用管道运算符来操作输入值。例如:

this.formControl.valueChanges
.pipe(
    distinctUntilChanged(),
    filter(v => v.length > 3),
    tap(console.log))
.subscribe();

我同意 Tim 对你的 post 的评论:"keyUp" 不会被解雇,例如copy-paste 一些文本到您的表单中,而在这种情况下也应该触发 valueChanges AFAIK

我会使用 valuesChanges() 而不是 keyup,因为你不太可能错过任何东西,因为它正在监听表单控件值的更改而不是事件。因此,无论如何,它会被实用地或通过 dom 更改,这些更改将被注意到。

这需要使用取消订阅来处理,因为它不是 http 请求,订阅完成后不会手动取消订阅。我会尝试类似的东西。

public subscriptions = new Subscription();

this.subscriptions.add(this.formControl.valueChanges
.pipe(distinctUntilChanged()) // makes sure the value has actually changed.
.subscribe(data => console.log(data)));

public ngOnDestroy(): void
{
    this.subscriptions.unsubscribe();
    // ensure when component is destroyed the subscription is also and not left open.
}

可以找到取消订阅的示例here

正如我在评论中提到的,valueChanges 将对 copy/pasted 值或从浏览器自动插入的值(自动填充表单)作出反应。此外,在 移动设备 上,关键事件可能不是正确的选择,因为其他事件可能会导致表单中的值发生变化。

在我看来,KeyListeners 应该只在没有好的选择时使用。它们可能会影响您应用的性能。