正在将服务中的数据更改传播到控制器



我有一个用于存储一些应用程序公共数据的服务。此服务还可以修改此数据并对事件作出反应。但是,我在将更改传播到使用此服务的控制器时遇到了问题。

我看到了这个问题和这个问题,但解决方案对我不起作用。

我创建了一个plunker,显示了我的核心问题是什么。在CCD_ 2中存在存储公共数据的服务CCD_。它有一个updateObject功能,可以更新数据(在我的真实应用程序中,它会向服务器发送请求)。该服务由主控制器使用。然而,当在服务中调用updateObject时,在控制器中不更新数据。

为什么?这是最好的做法还是我做错了什么?

这是代码:

app = angular.module('app', []);
app.factory('object', ['$timeout', function($timeout){
  var sharedObject = {attr1: '', attr2: ''};
  var updateObject = function() {
    $timeout(function(){
      sharedObject = {attr1: 'new value', attr2: 'update value'};
      console.log('updated');
    }, 1000);
  }
  updateObject();
  return sharedObject;
}]);
app.controller('main', [
  '$scope', 'object', function($scope, object) {
    $scope.$watch(function(){return object}, function(obj){
      console.log(obj);
      $scope.object1 = obj;
      }, true);
  }
]);

问题是超时回调不会更新您正在观察的对象。它用另一个对象替换它。所以观察者仍然看到未修改的旧对象。

将代码替换为,如此更新的plunker中所示

sharedObject.attr1 ='new value';
sharedObject.attr2 = 'update value';

您将在页面中看到值的变化。

问题是,在update方法中,您将sharedObject最初指向的对象替换为另一个对象。控制器将仍然保持对旧对象的引用。

您需要做的是将sharedObject更新到位。查看我更新的plunkr

基本上,你需要在更新方法中做这样的事情

 sharedObject.attr1= 'new value';
 sharedObject.attr2= 'update value';

最新更新