ExpressionChangedAfterIsHasBeenCheckedError 因为在 angular 2 中更新了我的下拉列表
ExpressionChangedAfterIsHasBeenCheckedError because of updating my dropdownlist in angular 2
正如标题所说,我得到了一个 ExpressionChangedAfterIsHasBeenCheckedError
并且在阅读 this article 之后,据我所知,这是一个警告,以防止不一致。正是那些话。所以在某些时候我可能违反了单向流(我假设)。
我有:
一个下拉框。
<select id="product" [(ngModel)]="model.searchParameters.productId">
<option *ngFor="let product of products [value]="product.id">{{product.name}}</option>
</select>
触发checkIban的输入框。
<div *ngIf="checkIban(productnumber, searchForm)">
//show validation errors
</div>
checkIban(field: any, form: any): Boolean {
if(field.dirty)
{
if(field.viewModel.length === Productnumber.Iban )
{
this.model.searchParameters.productId = Product.Ibannumber;
}
}
}
我认为我理解 ExpressionChangedAfterIsHasBeenCheckedError
的概念,不幸的是,对我来说,还不足以真正应用适当的解决方案来解决这个问题。
使用 setTimeout
不是一个选项(我试过),因为它会产生不可预测的状态(如文章中所写)。
那么有人可以给我一些关于我做错了什么的指示吗?
绑定到视图中的函数在 Angular 中通常不是一个好主意,因为每次更改检测 运行 时都会调用该函数。当 2 个后续调用(在单个更改检测期间 运行)return 2 个不同的结果时,您会在问题中收到错误消息。
改为使用事件更新结果并将其分配给组件中的字段,然后改为绑定到该字段:
<select id="product" [(ngModel)]="model.searchParameters.productId"
(ngModelChange)="checkIban()">
<option *ngFor="let product of products [value]="product.id">{{product.name}}</option>
</select>
<div *ngIf="isIbanOk">
//show validation errors
</div>
checkIban(field: any, form: any): Boolean {
...
this.isIbanOk = result; // true or false
}
我决定在我的解决方案中添加 ChangeDetectionStrategy。
我的组件现在看起来像这样。
@Component{{
selector: 'search',
templateUrl:'./app/search/search.component.html',
changeDetection:ChangeDetectionStrategy.OnPush,
providers:[SearchService]
})
在大量阅读该主题后,我发现了这个解决方案。这似乎已经成功了。
正如标题所说,我得到了一个 ExpressionChangedAfterIsHasBeenCheckedError
并且在阅读 this article 之后,据我所知,这是一个警告,以防止不一致。正是那些话。所以在某些时候我可能违反了单向流(我假设)。
我有:
一个下拉框。
<select id="product" [(ngModel)]="model.searchParameters.productId">
<option *ngFor="let product of products [value]="product.id">{{product.name}}</option>
</select>
触发checkIban的输入框。
<div *ngIf="checkIban(productnumber, searchForm)">
//show validation errors
</div>
checkIban(field: any, form: any): Boolean {
if(field.dirty)
{
if(field.viewModel.length === Productnumber.Iban )
{
this.model.searchParameters.productId = Product.Ibannumber;
}
}
}
我认为我理解 ExpressionChangedAfterIsHasBeenCheckedError
的概念,不幸的是,对我来说,还不足以真正应用适当的解决方案来解决这个问题。
使用 setTimeout
不是一个选项(我试过),因为它会产生不可预测的状态(如文章中所写)。
那么有人可以给我一些关于我做错了什么的指示吗?
绑定到视图中的函数在 Angular 中通常不是一个好主意,因为每次更改检测 运行 时都会调用该函数。当 2 个后续调用(在单个更改检测期间 运行)return 2 个不同的结果时,您会在问题中收到错误消息。
改为使用事件更新结果并将其分配给组件中的字段,然后改为绑定到该字段:
<select id="product" [(ngModel)]="model.searchParameters.productId"
(ngModelChange)="checkIban()">
<option *ngFor="let product of products [value]="product.id">{{product.name}}</option>
</select>
<div *ngIf="isIbanOk">
//show validation errors
</div>
checkIban(field: any, form: any): Boolean {
...
this.isIbanOk = result; // true or false
}
我决定在我的解决方案中添加 ChangeDetectionStrategy。
我的组件现在看起来像这样。
@Component{{
selector: 'search',
templateUrl:'./app/search/search.component.html',
changeDetection:ChangeDetectionStrategy.OnPush,
providers:[SearchService]
})
在大量阅读该主题后,我发现了这个解决方案。这似乎已经成功了。