我有两个控制器,A& B,使用以下服务共享数据:
angular.module('data-sharer',[])
.factory('datasharer', function () {
var sharedData = null;
var setSharedData = function (data) {
sharedData = data;
};
var getSharedData = function () {
return sharedData;
};
return {
setSharedData:setSharedData,
getSharedData:getSharedData
};
});
如果控制器A更新服务中的数据,我如何通知控制器B服务中的数据已经改变?
我的偏好是不使用$ rootScope& $ broadcasts - 告诉所有控制器数据已经改变似乎有点沉重。
是否有一些可以使用回调函数的方法?
答案 0 :(得分:0)
为此目的使用广播 从控制器A发送广播
$ rootScope。$ broadcast('scanner-started',{any:{}});
收到控制器B的广播 $ scope。$ on('scanner-started',function(event,args){
var anyThing = args.any;
// do what you want to do
});
答案 1 :(得分:0)
https://github.com/pviraj/Angular-Service-To-Share-Data-Beween-Controllers
本质上它是一个带有getter和setter的服务,它们在控制器负载上调用。
答案 2 :(得分:0)
如前所述,广播是为此而设的。此外,如上所述,使用服务作为数据的中心源也可以。
小提琴示例:https://jsfiddle.net/gzgkz3cr/
function Service() {
var service = {
data: {
name: 'Rob'
}
};
return service;
}
function ControllerA(Service, $rootScope) {
var vm = this;
vm.data = angular.copy(Service.data);
vm.updateData = updateData;
function updateData() {
Service.data.name = vm.data.name;
$rootScope.$broadcast('data_updated', vm.data);
}
}
function ControllerB(Service, $scope) {
var vm = this;
vm.data = Service.data;
$scope.$on('data_updated', function(e, data) {
alert('new data: ' + data.name);
});
}
答案 3 :(得分:0)
您可以使用pub-sub服务机制。
PUB-SUB:在角度情况下的这个机制中,第二个ctrl将使用一些常用服务订阅方法。并且第一个ctrl将发布一些数据,因为第一个ctrl发布任何数据然后第二个ctrl订阅的方法/函数将自己调用。
请在此处查看演示demo fiddle
var myApp = angular.module('myApp',[]);
myApp.factory('datasharer', function () {
var sharedData = null;
var registeredFunc = null;
var setSharedData = function (data) {
registeredFunc(data)
};
var registerForSharedData = function (functionCb) {
registeredFunc = functionCb;
}
return {
setSharedData:setSharedData,
getSharedData:getSharedData,
registerForSharedData:registerForSharedData
};
});
function MyCtrl($scope, datasharer) {
$scope.sharedData = datasharer.getSharedData();
$scope.send = function() {
datasharer.setSharedData($scope.name);
}
}
function My2Ctrl($scope, datasharer) {
function getSendData(data) {
console.log(data);
$scope.sharedData = data;
}
datasharer.registerForSharedData(getSendData);
}