Angularjs 将数据更改通知控制器
我有两个控制器A和B,它们使用以下服务共享数据:Angularjs 将数据更改通知控制器,angularjs,Angularjs,我有两个控制器A和B,它们使用以下服务共享数据: angular.module('data-sharer',[]) .factory('datasharer', function () { var sharedData = null; var setSharedData = function (data) { sharedData = data; }; var getSharedData = function () { return sharedData;
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-告诉所有控制器数据已更改似乎有点过于苛刻
有什么方法可以使用回调函数吗?为此使用广播 从控制器A发送广播 $rootScope.$broadcast('scanner-started',{any:{}}) 从控制器B接收广播 $scope.$on('scanner-started',函数(事件,参数){
})) 几个月前我遇到了类似的问题,我发现这很有用:
本质上,它是一个带有getter和setter的服务,在控制器加载时调用这些getter和setter。如前所述,广播就是为了实现这一点。此外,如前所述,使用服务作为数据的中心源也会起作用 小提琴示例:
您可以使用发布子服务机制 PUB-SUB:在这个机制中,在angular的情况下,第二个ctrl键将使用一些公共服务订阅一个方法。第一个ctrl键将发布一些数据,当第一个ctrl键发布任何数据时,第二个ctrl键订阅的方法/函数将自行调用 请看这里的演示
您可以只公开
sharedData
变量,这样两个控制器都指向相同的实例:return{sharedData:sharedData}
,当控制器位于不同的页面上时,该实例可以正常工作,或者在第一个控制器之后实例化第二个控制器。我的问题是,我的两个控制器都在同一页上。当我单击视图A中的某个项目时,视图B需要用所选项目更新。@DonalM-ah我明白了。好的,那么广播就可以很好地工作了。如果你想要一个例子,请让我知道。它们很容易理解。首先,你的代码会造成内存泄漏。其次,我认为这样的服务通常是个好主意——它看起来像全局变量。我真的很想看到你将如何在一个页面上使用太多这样的控制器对——创建两个服务?嗨,Petr,示例中的内存泄漏在哪里?
var anyThing = args.any;
// do what you want to do
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);
});
}
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);
}