- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
阅读 How to use RxJs distinctUntilChanged?和 this ,似乎 distinctUntilChanged
将输出流更改为仅提供不同的连续值。
我的意思是,如果相同的值立即连续到达,那么您实际上是在过滤流,并且只得到该重复值的一次出现。
如果我这样写:
this.myFormControl.valueChanges
.debounceTime(1000)
.distinctUntilChanged()
.subscribe(newValue => {
console.log('debounced: ', newValue);
});
我看不出输出有什么不同:
this.myFormControl.valueChanges
.debounceTime(1000)
.subscribe(newValue => {
console.log('debounced: ', newValue);
});
我看到一些地方建议在订阅表单输入的 valueChanges
时使用 distinctUntilChanged
— 但我不太明白为什么。
这是一个输入,所以如果用户正在输入,它总是在变化,对吧?这些值将始终不同,因此您只是无缘无故地添加了一个额外的操作来过滤输入。
还是我在这里遗漏了什么?
编辑
根据我的第一个代码示例,使用 distinctUntilChanged
,我创建了一个值为 Mr Trump
的表单输入,并确保将其保存在模型中。
然后我在控件内部单击并粘贴了 Mr Trump
。由于值是相同的,我希望看不到任何记录 — 控件具有与之前相同的值,所以 distinctUntilChanged
应该忽略它吗?
编辑 2
在进一步查看我的测试后,这种行为似乎是因为我使用了一个 AbstractControls
数组:
this.itemsControl = <FormArray>this.form.controls['items'];
...
this.itemsControl.controls[index].valueChanges...
因此,尽管当输入值相同时它仍然会触发有点奇怪,但我猜我需要连接到此数组项(一个表单组)中实际输入的 valueChanges
),而不是数组项本身。
编辑 3
因此,将 EDIT 2 中的代码更改为以下内容后,将已存在的相同值粘贴到输入控件中不会触发 valueChanges
(如预期)。在 EDIT 2 中,valueChanges
Hook 到整个 formGroup
,而不是单独的输入控件(在本例中称为 content
):
let fg = this.itemsControl.controls[index]; // get the formGroup
fg['controls'].content.valueChanges
.debounceTime(1000)
.distinctUntilChanged()
.subscribe(newValue => {...});
最佳答案
distinctUntilChanged
当应用于 valueChanges
可观察...
...可能永远都行不通!
它仅在单个值上按预期工作(如您所说)。因此,即使没有任何更改,您也会获得一个新值。
要跟踪整个表单的更改,您需要编写自定义比较器,其中最简单的使用 JSON.stringify
来输出可以比较的值。 valueChanges
observable 发出一个对象,而 distinctUntilChanges
不够智能,无法执行 reference compare 之外的任何事情。 (这是指向 RxJS 源代码的链接)除非您提供比较器函数。
this.form.valueChanges.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) ===
JSON.stringify(b)))
.subscribe(changes => { console.log('The form changed!'); });
distinctUntilChanged
适用于具有基本类型的单个值,因为 ===
足以检测更改。
如果您尝试将 distinctUntilChanges
添加到您的管道(对于整个表单)以避免在以编程方式更新表单值时出现无限循环 - 您可能需要这样:
this.form.patchValue(address || {}, { emitEvent: false });
关于angular - FormControl.detectchanges - 为什么使用 distinctUntilChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889851/
我正在使用 ng2-toastr 并收到以下错误 https://www.npmjs.com/package/ng2-toastr Attempt to use a destroyed view: d
有以下 2 个实体,具有以下属性: Parent ID Children Child ID ParentID Parent 现在我有以下代码: db.Confi
这个问题在这里已经有了答案: Angular 2 - View not updating after model changes (5 个答案) 关闭 6 个月前。 我正在开发 Angular 4
我使用的是 Angular2 的最终版本。 fixture.detectChanges() 调用了哪些生命周期事件,调用顺序是什么? 这方面的文档在哪里? 最佳答案 使用 fixture.detect
我正在尝试测试一个组件调用 detectChanges上面注入(inject)了ChangeDetectorRef 我已经逐步完成了代码,它肯定被调用了,但似乎我在组件和测试中得到了不同的 Chang
我将从以下概念开始这个问题:我在 StackOverflow 上看到了一个类似的问题,但该问题只回答了差异。 我想问的是我应该根据情况使用什么以及一种或另一种方法可能有什么缺点。 我知道 detect
说, - 有一个父组件 A 和一个子组件 B。 在组件B上设置OnPush。 有一刻,B 的一个不是输入绑定(bind)属性的属性发生变化,我想检测该变化并相应地更新 View 。 根据我的理解,应该
我正在复制 Angular 文档的一些示例以提高我对 Angular 单元测试的理解,但当我无法弄清楚发生了什么时,我最终进入了一个简单的测试用例。 这是我的 app.component.ts 文件,
我正在使用 Angular Meteor 2 创建一个简单的 UI。 1) 我有一个顶部导航栏组件,它有一个“注销”按钮。 2) 单击“注销”按钮时,它会重定向到“登录”。 3) 然后我在控制台中看到
我在测试中遇到 cdr.detectChanges() 问题。调用时发生错误,我没有任何信息,只是收到此错误: ZoneAwareError@webpack:///~/zone.js/dist/zon
我在 jasmine 中有以下代码: it('should pass on writing secondvalue in the input', async(() => { con
在 Angular 区域之外工作时,有两种方法可以检测变化 - 通过使用 NgZone.run 或使用 ChangeDetectorRef.detectChanges 方法重新进入区域。 NgZone
我的任务是为使用 Angular 开发的聊天应用程序编写测试。下面是我目前正在为其编写测试的 Angular 模板代码片段: check settin
阅读 How to use RxJs distinctUntilChanged?和 this ,似乎 distinctUntilChanged 将输出流更改为仅提供不同的连续值。 我的意思是,如果相同
第一个例子 我有以下测试: import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Com
ChangeDetectorRef.markForCheck()有什么区别和 ChangeDetectorRef.detectChanges() ? 我只有found information on S
所以我的应用程序一直给我这个错误: extensions::uncaught_exception_handler:8 Error in event handler for runtime.onMess
我正在阅读 this文章中包含有关何时使用的部分 markForChange() . 在他的例子中,他有以下组件: @Component({ selector: 'cart-badge', t
我对 context.SaveChanges 是否会自动调用 DetectChanges 感到困惑。大多数有关 Entity Framework 的书籍和博客都说会。但我的简单代码片段。看起来 Sav
我正在用 Jasmine 和 Karma 学习单元测试。我的测试用例正在通过,但我不明白一件事。这是我的 typescript : // array list of objects where eac
我是一名优秀的程序员,十分优秀!