javascript - 为什么我的 Angular.js Controller 在以下代码中执行了两次它的功能?

标签 javascript angularjs controller

我有一个 ng-repeat 循环遍历属于 SomeController 的对象数组:

<div ng-controller="SomeController as aCtrl">
  <div ng-repeat="category in aCtrl.categories">
    <p ng-show="aCtrl.checkShouldBeDisplayed(category)">{{category.name}}</p>
  </div>
</div>

Controller 定义为:

app.controller('SomeController', function() {

this.categories = [{
  "name": "one",
}, {
  "name": "two",
}, {
  "name": "three",
}, {
  "name": "four",
}];

this.counter = 0;

this.checkShouldBeDisplayed = function(channel) {
  this.counter = this.counter + 1;
  console.log("executing checkShouldBeDisplayed " + this.counter);
  return true;
};

}); 

我希望 checkShouldBeDisplayed 函数计数为 4,因为 SomeController.categories 数组中有四个元素。相反,它计数为 8 - 在这里查看:http://plnkr.co/edit/dyvM49kLLTGof9O92jGb (您需要在浏览器中查看控制台以查看日志)。我怎样才能避免这种行为?干杯!

最佳答案

这是预料之中的;指令 ng-repeat 将重复框架认为正确的次数;这称为脏检查,您可以在 this post 中阅读更多相关信息。 .

因此,最好以声明方式思考而不是命令式思考。换句话说,方法 checkShouldBeDisplayed 应该只做它在 jar 头上所说的,而不依赖于它被调用的次数。如果您需要执行某种聚合或操作,则应在 Controller 的其他位置完成。

关于javascript - 为什么我的 Angular.js Controller 在以下代码中执行了两次它的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24459240/

相关文章:

javascript - 异步函数是否总是需要使用await 来调用?

javascript - 将无序列表转换为 JSON

javascript - Angular JS - 重新加载整个页面

angularjs - 如何使用 Protractor 识别 ionic 标签?

php - Symfony2,FOSRestBundle - 捕获异常

javascript - 将两个函数绑定(bind)到 jQuery 中的一个按钮

jquery - 在 Excel 上固定标题和第一行,如带过滤器的表格

未找到 JavaFX Controller 方法

ember.js - Ember 生成的服务在注入(inject)时引发错误

javascript - 从 angularjs Controller 调用时显示 html