2014-11-06 46 views
2

我只是想了解为什么在下面的jsFiddle'这里是一个lo'被打印三次。需要角度直接负载的解释

http://jsfiddle.net/wg385a1h/5/

$scope.getLog = function() { 
    console.log('here is a log'); 
} 

有人能解释我为什么?我应该更改为只有一个日志“这里是一个日志”(这就是我想要这个小提琴)。非常感谢。

+0

一个好的起点:https://www.ng-book.com/p/The-Digest-Loop-and-apply/ – gearsdigital 2014-11-06 11:00:25

回答

2

Angular使用摘要周期/迭代来确定状态何时发生变化并需要更新UI。如果它在其中一个周期中发现任何变化,它将继续重新运行循环,直到数据稳定。如果完成了10个周期并且数据仍在变化,那么您将看到一条相当知道的消息:“angularjs 10迭代到达,中止”。

因此,您看到消息显示3次的事实是因为您有一个简单的界面。实际上,由于您的指令使用{{getLog()}},因此您可以在日志中获得更多此类消息。 Angular不断评估表达式,看看它是否发生了变化。

为了避免出现这样的问题,在正常情况下,应该只将您希望调用的函数返回的值存储在控制器内的$ scope对象中,并在UI中使用该变量(而不是函数调用)。

因此,在控制器中你有$ scope.log = getLog()[假设它返回一些东西,而不只是写入控制台],并在指令中使用模板{{log}}。这样,每个控制器实例只能获取一次该值。

希望我清楚了。

+0

好的,的确,我已经得到了这个。但是如果函数接受一个参数并且在ng-repeat中被调用(每次重复中的不同参数)呢?你怎么写这样的函数调用?这里是一个例子:http://jsfiddle.net/wg385a1h/12/ – clement 2014-11-06 11:19:32

+0

在这种情况下,我建议重新考虑整个模型。因为在UI中使用每个参数只有一次函数被调用是有点过分的。 – 2014-11-06 11:48:07

+0

您可以构建一个对象,该对象保存用户界面所需的信息,对于该特定组件...调用您需要初始化它并将结果存储在对象内的所有函数。然后在UI中使用该对象。这样,角度的迭代不会触发不需要的功能,并且以实际方式存储日期,以便在需要时进行更改。 – 2014-11-06 11:50:01