2017-08-11 67 views
-2

我正在尝试在我创建的表中填充多行。该表成功填充,但是出现错误:

“ExpressionChangedAfterItHasBeenCheckedError:检查后表达式已更改。上一个值:'1'。当前值:'ah'。”


这不是一个真正的问题,因为错误不会导致我的程序或任何东西崩溃,但是无论何时我更改表格中的任何单位,它都会将所有单位的值更改为“当前值”为在上面的错误。 (在这种情况下,我做了“啊,”见下面的代码)

这是我如何填充表:Angular 2 - ExpressionChangedAfterItHasBeenCheckedError

<div class="row-container"> 
    <div *ngFor="let week of getWeeks()" class="row"> 
    <input class="week" maxlength="2" (input)="type($event.target.value, week)" value="{{getCapacity(week)}}"> 
    </div> 
</div> 


这就是我如何更新值:

getCapacity(week: Date): string { 
    if (<conditions are met>) { 
     const capacity = EntryComponent.capacity[EntryComponent.index]; 
     EntryComponent.index++; 
     return capacity.value; 
    } 
    return 'ah'; 
} 

我没有使用动态组件作为标记,而是动态更改输入标记的值。

+0

我想你可以猜测:你应该已经把价值绑定并改变它。 – Vega

+0

[Angular动态组件加载 - ExpressionChangedAfterItHasBeenCheckedError]可能的副本(https://stackoverflow.com/questions/43917940/angular-dynamic-component-loading-expressionchangedafterithasbeencheckederror) –

+1

在开发模式中,Angular运行每个更改循环两次,并且错误正在发生,因为它们之间发生了变化(它不应该)。这可能是因为你的第一个改变循环正在改变你的“条件满足”条件。 – LarsMonty

回答

1

当处于开发模式时,Angular将每次更改检测循环运行两次 - 正常运行一次,第二次运行以确保初始循环期间没有任何变化。如果有什么改变,ExpressionChangedAfterItHasBeenCheckedError将被抛出。这并不意味着你的应用程序不能工作,但更多的是Angular警告你这种行为。

在你的情况下,错误是在此代码:

if (<conditions are met>) { <--- Creating behavior that causes error 
    const capacity = EntryComponent.capacity[EntryComponent.index]; 
    EntryComponent.index++; 
    return capacity.value; 
} 
return 'ah'; 

如果改变的环路内发生的事情改变了条件,有回报capacity.value第一循环,病情会发生变化,而第二循环将不符合条件,并返回ah。这是导致错误,这是一个适当的警告:我不会建议绑定的目标依赖于在更改循环期间更改的条件。我建议重新配置这个条件取决于你的组件的某些属性。