Angularjs 多次执行角度范围函数
我已经在作用域上定义了一个函数。当我从{{}内的视图调用它时,它执行X次 控制器Angularjs 多次执行角度范围函数,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我已经在作用域上定义了一个函数。当我从{{}内的视图调用它时,它执行X次 控制器 function testCtrl($scope) { $scope.myFunc = function(name) { return "Hello " + name; } } HTML {{myFunc('Joe')} 您可以在本例中看到: 或与Plunker一起: 我猜这样做是错误的,但为什么要执行这么多次呢?这是预期的行为。角度表达式({{expression}})在每个循环上重
function testCtrl($scope) {
$scope.myFunc = function(name) {
return "Hello " + name;
}
}
HTML
{{myFunc('Joe')}
您可以在本例中看到:
或与Plunker一起:
我猜这样做是错误的,但为什么要执行这么多次呢?这是预期的行为。角度表达式(
{{expression}}
)在每个循环上重新计算(有时每个循环多次)。这意味着表达式在计算方面应该保持轻量级
因此,表达式求值不应导致AJAX调用或其他密集或异步操作,或者如果必须,则应缓存结果。您的函数运行10次。为什么是10?为什么不是100 答案是: 监视侦听器可能会更改模型,这可能会触发其他 听众要开火。这是通过重新运行观察程序来实现的,直到没有 检测到更改。重新运行迭代限制为10,以防止 无限循环死锁 当您看到这种情况发生时,这意味着您正在以这样的方式更改模型,Angular必须重新运行摘要并再次启动手表。在您的特定情况下,您正在调用一个更新计数器的函数,该计数器显示在页面上。当计数器值更改时,它再次运行摘要,该摘要调用更新计数器的函数,等等
AngularJs希望您(实际上也鼓励您)更改模型并让视图响应这些更改,而不是相反。AngularJs不建议您在渲染时更改scope的模型。若要更改作用域的模型,请在控制器或指令中进行更改
将视图视为仅显示数据(本例中为范围值)的位置,所有数据的修改都应在控制器或指令中进行。使用plunker link更新。您能告诉我如何准确跳过此问题吗?我的回答中遗漏了此部分。。。好吧,我想这不是问题吧?柜台只是一个例子,让它更清楚。如果有一个日志,我想每个观察者都会记录一次?有没有办法重新使用它?因为在应用程序中,我们总是使用一组属性来操作值。例如,全名=名字+姓氏,地址=城市+Pin。所有属性都是用户模型的一部分。现在,若城市发生了变化,则无需再次填写全名。这可能会导致性能不佳。@Nitul我已经有一段时间没有使用Angular了。我建议在另一个问题中问这个问题。如果你是指计数器值,那么它只是为了让我的例子更清楚。你可以在那里放一个日志。Zetteic的答案在技术上是正确的,但它回答了plunkr,而不是这里发布的问题(它们是不同的)。这个答案是针对贴在这里的问题的。
<div>{{myFunc('Joe')}}</div>