[英]Angular: setter input with sideffect
我正在阅读有角度的文档,这使我对以下句子REF产生了疑问
“模板表达式的评估应该没有明显的副作用...”
如果我正确理解,那是因为“单个检测周期”执行了“模板表达式”:如果模板表达式更改了呈现视图所依赖的信息,它将不会显示该检测周期内的更改...
我的疑问是: 出于同样的原因,可以肯定地说
输入设置器的组件不得使设置器具有可见的副作用
例
可能导致以下结果: 将输入传递到组件时,“列表”无法正确呈现
interface MyType{
description: string
}
@Component({
selector: 'my-cmp',
template: `
<div *ngFor="let item of _list">{{item.description}}</div>
`
}),
export class MyComponentList{
_list: MyType[];
@Input() set list( items: MyType[] ){
if(isListValid){
this._list = items;
}
this._list = [];
}
isListValid( aList: MyType[] ): boolean{
// logic
}
}
“模板表达式的评估应该没有明显的副作用...”
这意味着,即您在模板中使用了某些东西,即您使用过的事实,不应有任何副作用,例如执行请求,更改数据模型,修改dom等,更改某些属性。
最后一种情况可能很烦人且难以调试,因为在以下情况下会出现ValueChangedAfterCheckedException
错误,例如,每次使用某种getter方法(在模板中也使用该方法)时都会增加一些计数器。
现在至于您的声明:
输入设置器的组件不得使设置器具有可见的副作用
取决于具体情况-通常不会有问题,因为@Inputs是在初始化目标组件/对其进行检测之前对其进行评估和绑定的,因此它可以更改组件状态。
因此,在您的情况下,一切都会很好,因为setter将在组件的更改检测/渲染发生之前运行。 否则-它会退回到“无副作用”的一般规则。
如果仔细观察,您会发现onChanges
(在涉及@ input / @ output时调用)是角度分量的第一生命周期回调。 (甚至在onInit
回调之前)。 这样就可以进行修改-并且在此之前调用setter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.