Angular 绑定到ngModel的管道(纯或不纯)中的力变化检测

Angular 绑定到ngModel的管道(纯或不纯)中的力变化检测,angular,angular6,angular-pipe,angular2-changedetection,angular-changedetection,Angular,Angular6,Angular Pipe,Angular2 Changedetection,Angular Changedetection,我正在将一个ngModel值绑定到角度百分比管道,在ngModelChange上进行更新,updateOn设置为blur。除非再次输入相同的值,否则它工作正常。再次输入相同的值时,管道不会检测到更改,该值显示为十进制而不是百分比。我曾尝试将百分比管道重新创建为不纯净管道,但这不起作用。即使值与以前的值相同,如何强制管道检测更改 已尝试让管道返回WrappedValue.wrap(this.\u latestValue) 已尝试运行更改函数中的此。\u ref.detectChanges()

我正在将一个ngModel值绑定到角度百分比管道,在ngModelChange上进行更新,updateOn设置为blur。除非再次输入相同的值,否则它工作正常。再次输入相同的值时,管道不会检测到更改,该值显示为十进制而不是百分比。我曾尝试将百分比管道重新创建为不纯净管道,但这不起作用。即使值与以前的值相同,如何强制管道检测更改

已尝试让管道返回
WrappedValue.wrap(this.\u latestValue)

已尝试运行更改函数中的
此。\u ref.detectChanges()


updateAssignments($event){
const cleanEvent=Number($event.replace(/[^\d.]/g,”);
account.percentage=(cleanEvent/100);
}
期望值以百分比格式显示。重新输入后显示十进制值


它只会在模糊输入后更新,因为您将ngModelOptions设置为仅在模糊时更新:)


删除它就可以了。

试试
[ngModelOptions]=“{updateOn:'change'}”


在试图找到一个合适的解决方案时,我设法强制pure
currency
管道以相同的值重新执行()。但这并没有解决问题,因为即使管道重新执行,它最终也会返回相同的结果。由于该结果绑定到
ngModel
作为
@Input
类似
[ngModel]=“account.percentage | percent:'1.0-2'”
ngochanges
钩子不会更新输入元素视图值

这是(取自)ngModel如何捕获更改和更新值/视图

@Input('ngModel')模型:任意;
...
ngOnChanges(更改:SimpleChanges){
这是一个错误;
如果(!this._注册)this._setUpControl();
如果(变更中的“isDisabled”){
此._已更新禁用(更改);
}
如果(iPropertyUpdated(更改,此.viewModel)){
this.\u updateValue(this.model);
this.viewModel=this.model;
}
}
这是
isPropertyUpdated

导出函数isPropertyUpdated(更改:{[key:string]:any},viewModel:any):布尔值{
如果(!changes.hasOwnProperty('model'))返回false;
常量更改=更改[“模型”];
if(change.isFirstChange())返回true;
return!相同(viewModel,change.currentValue);
}
// https://github.com/angular/angular/blob/53212db3ed48fe98c0c0416ae0acee1a7858826e/packages/core/src/util/comparison.ts#L13
导出函数(a:any,b:any):布尔{
返回a==b | | typeof a=='number'和&typeof b==='number'和&isNaN(a)和&isNaN(b);
}
由于
更改中的
模型
没有更改:SimpleChanges
isPropertyUpdated
返回false,视图不更新

因此,我尝试了以下黑客解决方法从头开始重新初始化输入,结果成功了:)

我在输入上放置了一个虚拟变量来显示/隐藏元素


无论何时
ngModelChange
发出输入,都会立即隐藏并显示

dummy=true;
构造函数(私有cdRef:ChangeDetectorRef){}
updateAssignments($event){
const cleanEvent=Number($event.replace(/[^\d.]/g,”);
this.account.percentage=(cleanEvent/100);
这个.dummy=false;
this.cdRef.detectChanges();
this.dummy=true;
this.cdRef.detectChanges();
log(“account.percentage:”,this.account.percentage);
}

==>>>我不明白为什么它不起作用。。。如果管道是纯净的,又有什么关系呢?相同的输入相同的输出对吗?管道停止工作了吗?嘿mah koreh gever?如果它是纯的,它只在输入变化时运行管道,如果它是不纯的,它运行每个变化检测周期。我已经讨论这个问题好几天了。有些东西很可疑。我的案例与此完全相同,只是我使用(模糊)并有一个条件管道:你知道如何使其工作吗?@verynear在你有时间并且解决方案适合你时,将接受的答案设置为ysf。如果没有
updateOn:blur
,它会在用户仍在键入时尝试添加百分号。但是是的,我试过了,只是想看看,即使使用默认设置(updateOn change),问题仍然存在。像这样调试是很困难的,您能提供一些类似于代码要点的东西吗?或者举个例子?参见上面的stackblitz链接。它可以正常工作,直到您尝试在一行中输入两次相同的值为止。如另一个答案所述,更改时的行为实际上是不可用的,只要用户键入一个数字,就可以添加%了。因此,例如键入41最终是一个奇怪的值,如4.00%1,它不起作用。此外,64中的复制粘贴会触发报告的管道未应用问题。(可能是一个不肮脏的检测或类似的东西?)这看起来很有希望!也许这不是让它工作的最纯粹的方式,但如果它工作了,它就工作了!:我今天下午去试试!是的!工作!我在下午将版本发送到QA,将查看是否出现任何问题,但初始测试没有问题。聪明的变通方法,完全符合我的要求!
<input placeholder="Percentage" type="text" 
       [ngModel]="account.percentage | percent: '1.0-2'"
       (ngModelChange)="updateAssignments($event)" 
       [ngModelOptions]="{updateOn:'change'}" class="ta-r" />