Директива AngularJS не реагирует на изменение атрибута

У меня есть директива чата, которую я использую для размещения чата на странице.

mod.directive('chat', function () {
  return {
    templateUrl: '/chat',
    replace: true,
    scope: { 
      chatID:'@chat',
    },
    controller: function ($scope, $element, $timeout) {
      var id = $scope.chatID
      ...
    },
    link: function ...
  }
})

HTML выглядит так:

<div class="chat" chat="{{currentChatID}}" ui-view="currentChat"></div>
<div class="content" ui-view="mainContent"></div>

Это в файле под названием "стандартный"

mod.config(function($stateProvider) {
  $stateProvider.state('standard', {
    views: {
      'main': {
        templateUrl: '/tmpl/standard',
        controller: function($scope, $timeout) {
          $scope.currentChatID = ''
          $scope.setCurrentChatID = function(newID) {
            $scope.currentChatID = newID
          }
        }
      }
    }
  })
})

Я использую angularjs-ui-router для создания родительского представления с директивой чата, обеспечивающей чат внутри этого представления. Это отлично работает при загрузке первой страницы, загружается чат. Но когда я меняю страницу/комнату чата, я использую другой контроллер для запуска setCurrentChatID(). Это изменяет currentChatID для элемента чата в DOM, я также вижу, что свойства элемента чата меняются на новый идентификатор в angularjs-batarang, но контроллеры директивы чата не запускаются. Как заставить это работать правильно/активировать контроллеры чата при изменении идентификатора чата?

Спасибо.




Ответы (1)


Трудно сказать, не видя остальную часть кода вашего контроллера chat, но вам может понадобиться $watch внутри вашего контроллера чата, например:

$scope.$watch('chatID', function(newValue, oldValue) {
    // run some code here whenever chatID changes
});

EDIT: Чтобы узнать больше о цикле $digest и операциях среды выполнения Angular, см. этот AngularJS. Руководство. (Проверьте раздел «Время выполнения»)

Подробнее о контроллерах см. в этом AngularJS: понимание контроллеров. Вот ключевые моменты, относящиеся к вашему вопросу:

Контроллеры следует использовать только для:

  1. Установите начальное состояние объекта области.
  2. Добавьте поведение к объекту области. (включая создание $watch и т. д.)

Цикл $digest обрабатывает только:

  1. очередь $evalAsync
  2. список $watch
person Dan    schedule 20.05.2013
comment
Мне просто интересно, должен ли код контроллера реагировать на дайджест или вам нужно вручную установить для этого часы. Это имеет смысл, если вам нужны часы. - person Harry; 20.05.2013
comment
Обычно сам контроллер должен запускаться только один раз на каждом маршруте. Любая логика, которую вы хотите запустить в дайджесте, должна быть вручную помещена в файл $watch. - person Dan; 20.05.2013