Angular 有棱角或打字的奇怪行为
我面临着一个非常奇怪的问题。我为此准备了stackblitz 问题是:Angular 有棱角或打字的奇怪行为,angular,angular-material,Angular,Angular Material,我面临着一个非常奇怪的问题。我为此准备了stackblitz 问题是: 从选择器中选择过滤两个 使用相同的选择器返回到“筛选一个” 输入Filter One输入一些随机值,例如123 按测试1按钮 意外的行为是输入字段被清除。看一看实现onTest1方法是如何实现的,然后看onTest2方法是如何实现的。当您按下test2按钮时,来自Filter One的输入将保持不变,但请查看onTest1和onTest2实现之间的差异。这只是顺序上的不同。在test1中,该值设置为索引0处的过滤器,然后nu
Filter One
输入一些随机值,例如123
测试1
按钮onTest1
方法是如何实现的,然后看onTest2
方法是如何实现的。当您按下test2
按钮时,来自Filter One
的输入将保持不变,但请查看onTest1
和onTest2
实现之间的差异。这只是顺序上的不同。在test1
中,该值设置为索引0处的过滤器,然后null
设置为索引1处的过滤器
在test2
中,将null
设置为索引1处的过滤器,然后将值设置为过滤器0
有人能解释这种奇怪的行为吗?我面临着更大的问题,这只是Stackoverflow帮助目的的冰山一角。目前我正在使用Angular
5.2.5
,我正在使用Google Chrome 67.0.3396.99在Macbook OSX 10.12.6上进行测试。您使用FormControl的方式并非出于预期,而且您暴露了一个副作用
该错误仅在您选择Filter Two并返回Filter One后出现的原因是,这会导致输入订阅第二个FormControl,而不会取消订阅它绑定到的原始控件
因此,在测试1中值变为空白的原因是,首先将filter[0]设置为该值,然后更新输入元素以显示该值,然后将filter[1]设置为null,然后更新输入元素以显示null
您应该更改代码,以便在输入上使用NgModel,或者按照预期使用被动表单
进一步解释
我在GitHub中进行了检查,问题出现在FormControlDirective中。当@input被更改时,它会从shared调用setupControl,并在其中侦听valueAccessor上的更改以提取视图。问题的出现是因为,据我所知,如果之前已经设置了一个值,那么在任何地方都不会调用某种类型的拆卸方法
替代方法
我不知道你为什么一开始就使用FormControl,但是如果过滤器必须是FormControl类型,那么你可以做的最简单的事情就是如下
<input matInput [ngModel]="selectedFilter.control.value"
[ngModelChange]="selectedFilter.control.setValue($event)" />
预期的行为是什么?当您在filter 2上并单击test 2两次时,输入被清除。我不明白为什么在步骤4之后输入字段filter One
被清除。我正在为它设置与用户提供的值相同的值,因此它被清除的原因。我对this.filters[1].control.setValue(null)进行了注释代码>在两个单击处理程序中。现在它还没有被清除。:)我知道。为什么当我在第二个过滤器上调用setValue(null)
时,它也会清除第一个过滤器?我创建了两个不同的FormControl,每个过滤器一个,所以为什么在第二个过滤器上设置null值也会清除第一个过滤器?我不明白。丹尼尔,你的意思是,这是因为我在做这样的事情,比如“someDynamicallyChangingFormControl”
?是的。我只见过在被动表单上下文中使用的[formControl]
。你离开了人迹罕至的道路,遇到了臭鼬。有趣的问题。有没有其他方法可以让我从具有不同验证规则的FormControl
数组中进行选择,并将其用于一个输入元素?应该有,但我对反应式表单做得不够,无法给出最佳答案。可以为每个筛选器指定一个值,并显示绑定到FormControl的输入。仅显示带有*ngIf的可见过滤器,并与所有过滤器下拉列表的值进行比较。想起来应该没什么不同。你的调查真的很有帮助。我将尝试使用*ngFor重新组织模板。好主意,顺便说一句。。。谢谢