Javascript 角度:更新服务并在控制器之间共享数据
我正在使用服务从API获取一些数据:Javascript 角度:更新服务并在控制器之间共享数据,javascript,angularjs,service,promise,factory,Javascript,Angularjs,Service,Promise,Factory,我正在使用服务从API获取一些数据: angular.module('myApp', []) .factory('myService', function($q, $timeout) { var getMessages = function() { var deferred = $q.defer(); $timeout(function() { deferred.resolve('Hello world!'); }
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
};
});
我在多个控制器中使用这些数据
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);
}
我想更新每个控制器中的数据,但当我更改ControllerA中的$scope.message时,它不会触发ControllerB中的更改
编辑:问题是我希望避免使用“$broadcast”和“$on”
有什么想法吗
这里有一个jsfiddle:您可以使用
$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;
});
}
谢谢您的回答,但问题是我希望避免使用“$broadcast”和“$on”。