Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 将数据更改通知控制器_Angularjs - Fatal编程技术网

Angularjs 将数据更改通知控制器

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;

我有两个控制器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-告诉所有控制器数据已更改似乎有点过于苛刻


有什么方法可以使用回调函数吗?

为此使用广播 从控制器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); 
}