繁体   English   中英

角度:带有副作用的设置器输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM