【问题标题】:Angular controller initialized every time its attribute changesAngular 控制器在每次属性更改时初始化
【发布时间】:2016-04-16 17:53:07
【问题描述】:

我正在使用带有 ngRoute 的 angularjs 1 构建一个单页应用程序,但遇到了一个问题。

我有一个使用控制器 (PostsController) 的视图 (/posts),该控制器具有一个名为“posts”的属性,该属性是一个包含所有帖子的数组。这是一些代码:

(function(){
  angular
    .module('thingy.posts.controllers')
    .controller('PostsController', PostsController);

  PostsController.$inject = ['$scope'];

  function PostsController($scope) {
    var vm = this;

    vm.posts = [];

    activate();

    function activate() {
      console.log("Hi...");

      test();

      // Simulates loading all posts from db
      function test() {
        vm.posts = [1,2,3,4,5,6];
      }
    }
  }
})();

现在,如果我评论 test(),“Hi...”会在控制台中打印一次。 但是,当我取消注释时,“Hi...”会打印 1 + vm.posts.length 次(本例中为 7)。

而且,后续的函数调用也会执行 1 + vm.posts.length 次,这是有问题的。

关于导致此问题的原因以及如何解决此问题的任何想法?

编辑:有人建议错误可能出在我的模板/路由中他是对的。我在 ng-repeat 中使用了一个自定义指令,当我删除它时只有“嗨...”出现一次。

posts-index.html:

<div ng-repeat='post in vm.posts'>
    <post post="post"></post>
</div>

Post.directive.js:

(function () {
  'use strict';

  angular
    .module('thingy.posts.directives')
    .directive('post', post);

  function post() {
    var directive = {
      controller: 'PostsController',
      controllerAs: 'vm',
      restrict: 'E',
      scope: {
        post: '='
      },
      templateUrl: '/static/templates/posts/post.html'
    };

    return directive;
  }
})();

【问题讨论】:

  • 您的问题不在控制器中,一定是其他原因,请分享您的模板和路由声明
  • @DayanMorenoLeon 你是对的!我的自定义标签使用的是控制器,因此每次都创建一个...谢谢!

标签: javascript angularjs angular-controller angularjs-digest


【解决方案1】:

问题出在我的指令声明中:

var directive = {
      controller: 'PostsController',
      controllerAs: 'vm',

这是为我页面上的每个帖子初始化一个控制器。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2017-01-27
    相关资源
    最近更新 更多