Angular 错误:表达式ChangedTerrithasBeenCheckedError可变角度?

Angular 错误:表达式ChangedTerrithasBeenCheckedError可变角度?,angular,Angular,我有以下模板元素: <input class="form-check-input" type="radio" name="radio_{{ id }}" id="{{ id }}"> 我收到以下错误消息: 错误:ExpressionChangedTerrithasBeenCheckedError:表达式 已在检查后更改。以前的值: “103cb048-c966-4b76-b7

我有以下模板元素:

  <input
   class="form-check-input"
   type="radio"
   name="radio_{{ id }}"
   id="{{ id }}">
我收到以下错误消息:

错误:ExpressionChangedTerrithasBeenCheckedError:表达式 已在检查后更改。以前的值: “103cb048-c966-4b76-b795-31dd2234204c”。当前值:

该组件具有默认策略

“a04eba4a-06b6-400b-af6c-e9afe3040919”


在每个更改检测周期中,它都会调用
id()
getter,从而生成一个新的id。这很可能是不正确的,因为它还会导致
id
name
属性在输入上不同。我想你正在寻找这个:

import * as uuid from 'uuid';
  
public id: string = uuid.v4();

但是,我可以建议您使用
OnPush
更改检测策略,因为它将提高应用程序的性能。除了使更改检测更具逻辑性之外,如果在返回布尔值和tempolate的组件中有merthod,该怎么办:
。这也是不好的做法吗?@Mamkad:如果你使用默认的CD策略,是的。函数
isVisibleField()
也将为每个CD周期触发。@Mamkad是的,如果您从模板调用一个方法,这将触发一个额外的更改检测,并且您不知道它将被执行多少次,这是一种不好的做法-render@Mamkad事实上从模板调用函数并不是完全错误的做法。如果该方法很小,并且没有副作用,那么就没有明显的性能差异。这是因为模板中的每个表达式都已转换为函数,这将提高模板的可读性。只要返回值在一个检测周期内没有变化,一切都好。那么如何检查字段是否有另一个显示/隐藏的可见状态?
import * as uuid from 'uuid';
  
public id: string = uuid.v4();