在开发模式下,angular2通过区域执行2次循环检查,这将导致错误:检查后表达式已更改错误,是否保存到

在开发模式下,angular2通过区域执行2次循环检查,这将导致错误:检查后表达式已更改错误,是否保存到,angular,Angular,所以我有这个指令模板 <img [src]="getImageUrl()" (load)="onImageLoaded()" (error)="onImageError()" /> 我完全理解这一点,因为在开发模式下进行了第二区检查 如您所见,我更改了图像URL中的参数params,以便浏览器始终获得一个新的参数,并且在生产中可以正常工作 但这样安全吗?我的意思是ng2团队故意检查没有副作用的东西,但我正在创造一个副作用。。。如果是这样的话,那么避免这种情况的正确方法是什么?拆卸并

所以我有这个指令模板

<img [src]="getImageUrl()" (load)="onImageLoaded()" (error)="onImageError()" />
我完全理解这一点,因为在开发模式下进行了第二区检查

如您所见,我更改了图像URL中的参数params,以便浏览器始终获得一个新的参数,并且在生产中可以正常工作

但这样安全吗?我的意思是ng2团队故意检查没有副作用的东西,但我正在创造一个副作用。。。如果是这样的话,那么避免这种情况的正确方法是什么?拆卸并重新连接changeDetector真的是最好的方法吗?我已经尝试过了,但到目前为止,在开发模式下仍然会产生相同的错误(我可能需要再处理一些错误)

有没有办法听下一个应用程序点击,只在下一个点击时应用更改,这样就不会产生副作用

问候,


肖恩。

在这种情况下可能是安全的,但效率很低。在其他情况下,不在devMode中测试可能会隐藏真正的bug


而是编写代码,使其在devMode中也能正常工作。

在这种情况下可能是安全的,但效率很低。在其他情况下,不在devMode中测试可能会隐藏真正的bug


而是编写代码,使其在devMode中也能正常工作。

快速回答:使用setTimeout()

说明:

因此,我在样式属性中也遇到了这个问题。 比如:

工作得很有魅力

我同意Gunter的观点,尽量不要直接调用模板中的函数(如果可能的话),这样更难测试或更灵活

如果你做了

您可以执行
imageUrl=getImageUrl()
然后在以后执行:
imageUrl=getImageUrl(true,false,“无论什么”)
甚至重复使用模板和:
imageUrl=totalyothergetter()快速回答:使用setTimeout()

说明:

因此,我在样式属性中也遇到了这个问题。 比如:

工作得很有魅力

我同意Gunter的观点,尽量不要直接调用模板中的函数(如果可能的话),这样更难测试或更灵活

如果你做了

您可以执行
imageUrl=getImageUrl()
然后在以后执行:
imageUrl=getImageUrl(true,false,“无论什么”)
甚至重复使用模板和:
imageUrl=totalyothergetter()

我的想法正是。。。我知道在这种情况下没关系。。。因为我正在处理一个图像。但我想保持干净。那么,有没有一种方法可以让你听到应用程序的滴答声,从而知道什么时候应用更改是安全的呢?不知道你的意思。应用更改总是安全的,但在由更改检测调用的生命周期回调中除外(
ngochanges',
ngOnInit
ngAfterViewInit',…)。导致错误消息的原因是对绑定getter或方法的两个连续调用返回不同的值。要避免这种情况,可以将值存储到属性并绑定到thos属性,或者缓存该值并返回缓存的值。不鼓励直接在值绑定中使用函数。tx现在可以试一试了!有没有办法检测您是否在devMode中?我没有看到中公开的任何方法,这就是公开
enableProdMode()
的地方。如果我们有办法检测模式,我们可以编写
getImageUrl()
来感知模式。正如Gunter所建议的,我确实对devMode做了一个变通方法,但正确的方法是将其分配给一个成员,我将把它重构为。。。我的想法正是。。。我知道在这种情况下没关系。。。因为我正在处理一个图像。但我想保持干净。那么,有没有一种方法可以让你听到应用程序的滴答声,从而知道什么时候应用更改是安全的呢?不知道你的意思。应用更改总是安全的,但在由更改检测调用的生命周期回调中除外(
ngochanges',
ngOnInit
ngAfterViewInit',…)。导致错误消息的原因是对绑定getter或方法的两个连续调用返回不同的值。要避免这种情况,可以将值存储到属性并绑定到thos属性,或者缓存该值并返回缓存的值。不鼓励直接在值绑定中使用函数。tx现在可以试一试了!有没有办法检测您是否在devMode中?我没有看到中公开的任何方法,这就是公开
enableProdMode()
的地方。如果我们有办法检测模式,我们可以编写
getImageUrl()
来感知模式。正如Gunter所建议的,我确实对devMode做了一个变通方法,但正确的方法是将其分配给一个成员,我将把它重构为。。。德克萨斯州
browser_adapter.ts:78 ORIGINAL EXCEPTION: Expression has changed after it was checked. Previous value: 'http://galaxy.signage.me/Resources/Resellers/300762/Logo.jpg?random=' 0.10902238642453255'.
<div [style.color]="textColor">Cool Colored Text</div>
//Component
public textColor:string = "red";
ngAfterViewInit {
  this.textColor = getColor();
}
setTimeout(() => this.textColor = getColor();,10);