什么意思是"副作用"在Angular2文档中?

时间:2017-03-16 07:23:43

标签: angular

对于我来说,并不完全清楚"副作用"在Angular2文档中,例如在这里讨论这个时(模板语法部分):

Avoid side effects
As mentioned previously, evaluation of a template expression should have no visible side effects. The expression language itself does its part to keep you safe. You can't assign a value to anything in a property binding expression nor use the increment and decrement operators.

Of course, the expression might invoke a property or method that has side effects. Angular has no way of knowing that or stopping you.

The expression could call something like getFoo(). Only you know what getFoo() does. If getFoo() changes something and you happen to be binding to that something, you risk an unpleasant experience. Angular may or may not display the changed value. Angular may detect the change and throw a warning error. In general, stick to data properties and to methods that return values and do no more. 

如何评估表达式可能会产生副作用以及它如何影响UI表示或逻辑?

2 个答案:

答案 0 :(得分:2)

它测量值绑定中的表达式应该只计算一个值并返回它,但它们不应该修改其他变量的状态。

相反,事件绑定中的表达式应该会引起副作用。这就是Angular在调用事件侦听器后运行更改检测的原因。

另见https://en.wikipedia.org/wiki/Pure_function

答案 1 :(得分:1)

与几乎所有语言一样,属性不应导致状态更改或执行任何长时间运行的任务。 例如,请参阅此处的Microsoft指南:https://msdn.microsoft.com/en-us/library/ms182181.aspx

考虑到此整体指南,您会在此处看到更改跟踪代码:http://blog.angular-university.io/how-does-angular-2-change-detection-really-work/

正如您所看到的,更改检测非常简单:检查相等性并设置名为" isChanged"的属性。如果值不同,则为true。

现在,假设如果某些属性执行以下操作会发生什么:

  • Web-API调用
  • 更改其他属性值
  • 不是幂等的

我不知道确切的代码,但更改跟踪器应尽可能保持响应和简单,以执行如此多的运行,这就是为什么建议将属性保持为直接的原因可能的。