AngularJS指令不响应属性更改

问题描述 投票:4回答:1

我有一个聊天指令,可用于在页面上放置聊天室。

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创建一个父视图,其中chat指令在该视图内提供了聊天。这在第一页加载时工作正常,聊天在加载。但是,当我更改页面/聊天室时,我使用另一个控制器来运行setCurrentChatID()。这更改了DOM中chat元素的currentChatID,我还看到chat元素的属性更改为angularjs-batarang中的新ID,但是chat指令的控制器未运行。当chatID更改时,如何使它正常工作/激活聊天的控制器?

谢谢。

javascript angularjs angularjs-directive angularjs-scope angularjs-routing
1个回答
4
投票

很难看到您的chat控制器的其余代码,但是您可能需要在聊天控制器中使用$watch,例如:

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

EDIT:有关$digest循环和Angular的运行时操作的更多信息,请参见此AngularJS Guide。 (检查运行时部分)

有关控制器的更多信息,请参见本AngularJS: Understanding Controllers指南。以下是与您的问题有关的关键点:

控制器仅应用于:

  1. 设置范围对象的初始状态。
  2. 向行为对象添加行为。 (包括创建$watch等)

$digest循环处理:

  1. $evalAsync队列
  2. $watch列表
© www.soinside.com 2019 - 2024. All rights reserved.