【问题标题】:Angular 2 property binding lifecycleAngular 2 属性绑定生命周期
【发布时间】:2016-10-05 00:31:15
【问题描述】:

Angular 2 中定义的属性绑定生命周期是什么?例如,我的模板中有以下元素:

<input type="radio" name="{{choice.question_id}}" value="{{choice.id}}"
                    [checked]="isSelected()"
                    (change)="select()"
                    required>

这些属性和事件回调究竟是什么时候绑定的?据我所知,有一些循环会自动刷新绑定。我在哪里可以找到关于该周期的更好解释?

我上面的目标是在isSelected() 的情况下默认选择单选按钮。因此,在初始渲染后轮询isSelected() 是多余且低效的。如何将 [checked]="isSelected() 限制在元素首次添加到 DOM 的时刻?

【问题讨论】:

    标签: javascript html angularjs dom angular


    【解决方案1】:

    在每个更改检测周期评估绑定。

    在一些异步执行发生后运行更改检测。 Angulars zone 修补了大多数异步 API,如 addEventHandlerremoveEventHandlersetTimeout、... 在处理完此类事件后,Angular 运行更改检测并检查绑定到输入的所有表达式([]{{}})。

    此类事件非常频繁地发生,因此绑定表达式的评估非常频繁。因此,使这些表达式有效是很重要的。这是 Angular 团队不鼓励绑定到函数,而是将结果分配给属性并绑定到该属性的原因之一,因为属性的比较非常有效,甚至更好地绑定到可观察对象和承诺(使用 @987654327 @pipe) 主动通知更改。

    您无法定义在什么时候评估绑定。每次更改检测运行时都会对其进行评估。您可以通过设置ChangeDetectionStrategy.OnPush 而不是ChangeDetectionStrategy.CheckAlways(默认)来控制何时在您的组件或其子组件上运行更改检测,并“手动”调用更改检测。

    devMode 默认情况下,更改检测也会运行两次,以检查第一次更改检测轮次本身是否没有导致模型发生任何更改,这被认为是错误。如果您想知道为什么如此频繁地调用绑定方法,则需要考虑这一点。如果在 devMode 中将计数除以 2 以获得有效数字,就像在 prodMode 中发生的那样。

    【讨论】:

    • 一个选项将 [checked] 绑定到私有字段,由 ngOnInit() { checked = service.isChecked() } 初始化以减少服务调用负载。问题是,如果每次通过结构指令或路由将组件添加到 DOM 时都会调用 ngOnInit。我的应用程序中的逻辑是服务维护“表单”的状态,当用户导航离开并返回表单的某个部分时,每个输入都会从服务中轮询它的状态。所以只有在渲染一次时才需要服务调用
    • 是的 ngOnInit() 每次通过结构指令或路由添加到 DOM 时都会调用。我不会担心对服务的调用(至少如果这不会导致每次调用的某些服务器请求或 DOM 更新)会导致大量处理能力。组件不会经常添加/删除,与将组件添加到 DOM 导致的成本相比,调用服务的成本可以忽略不计。我会考虑这种过早的优化。如果该服务对每次调用都进行了昂贵的工作,而不是尝试通过例如缓存结果来优化它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2017-11-13
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多