我有一个聊天指令,用于在页面上放置一个聊天室。
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中聊天元素的currentChatID
,我还会看到聊天元素的属性更改为angularjs-batarang中的新ID,但聊天指令的控制器不会运行。当chatID发生变化时,如何使其正常工作/激活聊天控制器。
感谢。
答案 0 :(得分:4)
如果没有看到chat
控制器代码的其余部分,很难说,但您可能需要在聊天控制器中使用$watch
,如:
$scope.$watch('chatID', function(newValue, oldValue) {
// run some code here whenever chatID changes
});
编辑:有关$digest
循环和Angular运行时操作的更多信息,请参阅此AngularJS Guide。 (检查运行时部分)
有关控制器的更多信息,请参阅此AngularJS: Understanding Controllers指南。以下是与您的问题相关的要点:
控制器应仅用于:
$watch
等) $digest
循环仅处理:
$evalAsync
队列$watch
列表