Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 多次执行角度范围函数_Angularjs_Angularjs Scope - Fatal编程技术网

Angularjs 多次执行角度范围函数

Angularjs 多次执行角度范围函数,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我已经在作用域上定义了一个函数。当我从{{}内的视图调用它时,它执行X次 控制器 function testCtrl($scope) { $scope.myFunc = function(name) { return "Hello " + name; } } HTML {{myFunc('Joe')} 您可以在本例中看到: 或与Plunker一起: 我猜这样做是错误的,但为什么要执行这么多次呢?这是预期的行为。角度表达式({{expression}})在每个循环上重

我已经在作用域上定义了一个函数。当我从{{}内的视图调用它时,它执行X次

控制器

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>