我遇到了 AngularJS 的问题,我在自定义服务上使用回调,以便将数据从一个控制器传递到另一个控制器。
特别是,我正在尝试创建一个非常简单的日志记录服务,其中一个控制器向该服务注册一个侦听器函数,以便在记录消息时接收更新,而另一个控制器在单击 UI 中的按钮时记录一条消息(触发第一个控制器中的侦听器)。
侦听器函数然后更新一个$scope.messages
变量以在 UI 中显示新记录的消息。但是,当新到达的消息到达侦听器函数时,UI 不会更新。
我相信这是因为 AngularJS 不知道$scope.messages
正在更新。但是,尝试包装 with 的更新$scope.messages
并$scope.$apply
没有带来任何效果($apply already in progress)
。
HTML 代码:
<div ng-app="myApp">
<div ng-controller="ButtonCtrl">
<button type="button" ng-click="logMessage()">Button</button>
</div>
<div id="console" ng-controller="ConsoleCtrl">
<div ng-repeat="consoleItem in messages">{{consoleItem.message}}</div>
</div>
</div>
Javascript代码:
var module = angular.module('myApp', []);
module.factory('MyConsole', function($rootScope) {
var listeners = [];
var myConsoleService = {};
myConsoleService.log = function(messageObj) {
angular.forEach(listeners, function(listener){
listener(messageObj);
});
};
myConsoleService.registerListener = function(listener) {
listeners.push(listener);
};
return myConsoleService;
});
function ConsoleCtrl($scope, MyConsole){
$scope.messages = [{"message":"First message!"}];
MyConsole.registerListener( function(msgObj){
// while this console.log call below works as expected, the $scope.messages.unshift call does not update the view
$scope.messages.unshift(msgObj.message);
console.log($scope.messages);
});
}
function ButtonCtrl($scope, MyConsole) {
$scope.logMessage = function () {
MyConsole.log({message:"myLogmessage"});
};
}
为了您的方便,也可以在 JSFiddle 上找到代码:http: //jsfiddle.net/G5LAY/3/
任何帮助将不胜感激 :-)
谢谢!