我正在使用服务从 API 中获取一些数据:
angular.module('myApp', [])
.factory('myService', function($q, $timeout) {
var getMessages = function() {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve('Hello world!');
}, 2000);
return deferred.promise;
};
return {
getMessages: getMessages
};
});
我在多个 Controller 中使用这些数据。
function ControllerA($scope, myService) {
$scope.message = myService.getMessages();
$scope.updateMessage = function(){
$scope.message = 'Hello Max';
};
}
function ControllerB($scope, myService) {
$scope.message = myService.getMessages();
$scope.$watch('message', function(){
// 'Hello Max'
}, true);
}
我想更新每个 Controller 中的数据,但是当我更改 ControllerA 中的 $scope.message 时,它不会触发 ControllerB 中的更改。
编辑: 问题是我想避免使用“$broadcast”和“$on”。
有任何想法吗?
这是一个 jsfiddle:http://jsfiddle.net/Victa/McLQD/
最佳答案
您可以使用 $broadcast
将事件广播到 rootScope
并使用 $on
定义监听器以监听此特定事件。
function ControllerA($scope, myService, $rootScope) {
$scope.message = myService.getMessages();
$scope.updateMessage = function () {
$scope.message = 'Hello Max';
$rootScope.$broadcast("HelloEvent", {
msg: $scope.message
});
};
}
function ControllerB($scope, myService, $rootScope) {
$scope.message = myService.getMessages();
$rootScope.$on("HelloEvent", function (event, message) {
$scope.message = message.msg;
});
}
更新:
在您更新问题之前,我得到了上述解决方案。如果你不想使用 $broadcast 或 $on,你可以像这样通过
$rootScop
e 共享对象function ControllerA($scope, myService, $rootScope) {
$scope.message = myService.getMessages();
$scope.updateMessage = function () {
$scope.message = 'Hello Max';
$rootScope.message = 'Hello Max';
};
}
function ControllerB($scope, myService, $timeout, $rootScope) {
$scope.message = myService.getMessages();
$rootScope.$watch('message', function (oldV, newV) {
if(oldV === undefined && oldV === newV) return;
$scope.message = $rootScope.message;
});
}
Demo using broadcast
Demo without using broadcast
关于javascript - Angular : Update service and share data between controllers,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18195498/