ng-include被称为太频繁了

时间:2014-07-16 14:04:05

标签: javascript angularjs angular-ui-bootstrap

我发现当我使用ng-include时,它会经常被调用。

每次单击其中一个Nothing按钮或更改视图,或在输入框中键入内容时,getView都会多次运行。更改视图时最多6次。基本上做任何改变$scope的事情都会产生对getView的调用。

我创建了一个plunker来显示我正在描述的行为:plnkr.co

这是正常行为吗?有没有办法让它只运行一次?我担心因此可能会失去表现。

我的代码:

的index.html

<body ng-app="includeExample">
  <div ng-controller="ExampleController">
    <div class="row">
      <input type="text" ng-model="unrelated">
    </div>
    <div class="row">
      <tabset>
        <tab heading="View 1">
          <ng-include src="getView('template1')"></ng-include>
        </tab>
        <tab heading="View 2">
          <ng-include src="getView('template2')"></ng-include>
        </tab>
      </tabset>
    </div>
  </div>
</body>

的script.js

 angular.module('includeExample', ['ngAnimate', 'ui.bootstrap'])
   .controller('ExampleController', ['$scope',
     function($scope) {
       $scope.getView = function(filename) {
         console.log("getView " + new Date());
         return filename + ".html";
       };
     }
   ]);

Template1.html

Content of template1.html
<button type="button" class="btn btn-primary" ng-click="">Nothing</button>

2 个答案:

答案 0 :(得分:3)

Angular每次运行摘要时都会调用getView方法,以确保值没有更改。这是角度如何将模型和视图结合在一起的“神奇”的一部分。如果查看开发工具的网络选项卡,您将看到每次运行摘要时浏览器实际上都没有检索模板。知道摘要实际上是这样的 - 你应该开发相应的代码,在直接绑定到视图的方法中运行密集操作!

有关摘要本身的更多信息,请参阅:

希望有所帮助!

答案 1 :(得分:1)

是的,每当你做任何事情时,angularJS都会经过getView()。一个好的第一次迭代是将它分配给json对象而不是使用get方法。实际上,如果你不在html中使用任何get类型的方法,那会更好。然后,如果您真的希望它不会更改,您可以删除双向绑定(Render value without data-binding)。