通知控制器数据更改

时间:2016-04-08 13:30:30

标签: angularjs

我有两个控制器,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 - 告诉所有控制器数据已经改变似乎有点沉重。

是否有一些可以使用回调函数的方法?

4 个答案:

答案 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); 
}