为什么我的函数被多次评估?

时间:2013-11-21 20:00:23

标签: angularjs angularjs-scope

我正在尝试理解有趣的情况。在表面上一切正常,但我必须在函数中调试一些东西并注意到它被多次调用(确切地说是5次),即使我只在一个地方使用它。我在视图中有这个标记,它设置输入字段的最大长度。

<div class="name-field">
            <input placeholder="ID" type="text" id="form_ID" name="searchId" autofocus
                data-ng-model="vm.searchCriteria.searchId" data-ng-required="vm.isSearchIdRequired"
                data-ng-minlength="1" data-ng-maxlength="{{vm.getMaxLengthForSearchId()}}"
                data-ng-class="{'input-error': vm.isSearchIdValid}">
        </div>

getMaxLengthForSearchId()根据选中的某些复选框返回最大长度。我有三个控制器,我注入了我的viewModel,每个视图一个。外视图中包含一个外部视图和两个外部视图。总而言之,在Batarang中我可以在开发人员工具中看到5个范围,包括外部控制器的范围。我不会期望这会针对每个范围进行评估吗?我做错了什么?

Scope 1 (searchCtrl)
   Scope 2
      Scope 3 (searchFormCtrl)
   Scope 4
      Scope 5 (searchResultCtrl) 

正如我所提到的,这些控制器中的每一个都依赖于searchViewModel。我可以看到它只被实例化了一次,但是函数被调用了5次。请帮助我理解。

1 个答案:

答案 0 :(得分:0)

这是一个常见的问题。

在$ digest期间,将评估模板中表达式中引用的任何函数*。

要解决此问题,您需要尽可能预先计算范围属性的值。你可以用ng-change其他事件来做到这一点。


*(几乎所有:它取决于如何设置使用表达式的指令)