Контроллер Angular инициализируется каждый раз при изменении его атрибута

Я создаю одностраничное приложение, используя angularjs 1 с ngRoute, и столкнулся с проблемой.

У меня есть представление (/posts), использующее контроллер (PostsController), у которого есть атрибут с именем «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(), в консоли один раз будет напечатано "Привет...". Однако, когда я раскомментирую его, "Привет..." будет напечатано 1 + vm.posts.length раз (7 в этом примере).

Более того, последующие вызовы функций также выполняются 1 + vm.posts.length раз, что проблематично.

Любые идеи о том, что вызывает это и как я могу это исправить?

Изменить: кто-то предположил, что ошибка может заключаться в моих шаблонах/маршрутах, и он был прав. Я использую пользовательскую директиву внутри ng-repeat, и когда я удаляю ее, "Привет..." появляется только один раз.

сообщения-index.html:

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

Пост.директива.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;
  }
})();

person Guillaume Docquier    schedule 16.04.2016    source источник
comment
ваша проблема не в контроллере, должно быть что-то еще, что вызывает, пожалуйста, поделитесь своими шаблонами и объявлением маршрута   -  person Dayan Moreno Leon    schedule 16.04.2016
comment
@DayanMorenoLeon Ты был прав! В моем пользовательском теге использовался контроллер, поэтому каждый раз он создавался... Спасибо!   -  person Guillaume Docquier    schedule 16.04.2016


Ответы (1)


Проблема заключалась в моем объявлении директивы:

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

Это инициализировал контроллер для каждого сообщения на моей странице.

person Guillaume Docquier    schedule 16.04.2016