2013-11-21 55 views
0

我有一个有趣的情况,我想了解。表面上一切正常,但我不得不在函数中调试某些东西,并注意到它被多次调用(确切地说是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次。请帮助我理解。

回答

0

这是一个常见问题。

您的模板中的表达式中引用的任何函数*都将在$摘要中进行评估。

要解决这个问题,您可能希望预先计算您的范围属性上的值。你可以用ng来改变其他事件。


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

+0

哇,这是角一个隐藏的宝石?如果我打电话给远程服务,它会调用它5次。在任何地方都没有遇到过这种警告,但是我也是在5天前开始使用它,所以这可能是一个常识。 – epitka

+1

好吧,MV *架构会告诉你,你应该使用一个模型来进行视图的状态转换,而你的控制器应该完成所有的“工作”......所以绑定函数到视图应该是真正的避免。在$ scope上放置函数的精妙之处在于,您可以设置ng-click等事件。 –

+1

我看到你在说什么,但是,我使用控制器只是为了与viewmodels连接视图,就是这样。我几乎没有控制器的逻辑。我只需要将它从询问(调用函数)切换到命令式(告诉viewModel将我绑定视图的值更改为) – epitka

相关问题