2014-03-19 89 views
1

经过大量研究,我发现了以下答案,它与我的代码紧密匹配,并清楚地说明了如何使用共享服务(使用缓存和承诺)在控制器之间共享数据。Angularjs使用共享服务自动刷新控制器

https://stackoverflow.com/a/17472995/2341148

然而,这个答案(和所有其他我能找到的)不显示如何保持每个控制器同步。当某个控制器中的某些内容发生变化时,我希望其他控制器重新加载/刷新其数据。

例如,控制器“test”向服务器提交一些数据以更新用户名。现在控制器“test1”显示一个不同的名称,因为它有自己的作用域。可以做些什么来使“test1”重新加载服务以获取最新数据(无需刷新整个页面)?

有人可以扩展此代码以使测试在test1更改数据时重新加载服务吗?

var app = angular.module('plunker', []); 

     app.service('cache', function ($http,$q) { 
      var mycache={}; 
      return { 
       getdata: function (key) { 
        var deferred = $q.defer(); 
        if (mycache[key]) { 
         deferred.resolve(mycache[key]); 
        } 
        else { 
         $http.get('TextFile.txt').then(function (data) { 
          mycache[key] = data.data; 
          deferred.resolve(mycache[key]); 
         }); 
        } 
        return deferred.promise; 
       } 
      } 
     }); 


     app.controller('test', function ($scope, cache) { 
      cache.getdata('cache').then(function (data) { 
       $scope.data = data; 
      }); 
    }); 

     app.controller('test1', function ($scope, cache) { 
      //since data is already cached now it will server the cached data 
      cache.getdata('cache').then(function (data) { 
       $scope.data = data; 
      }); 
    }); 

回答

0

我从服务中发出一个事件。看起来有点像这样。

.service("Data", function($http, $rootScope) { 
    var this_ = this, 
     data; 

    $http.get(some_url, function(response) { 
    this_.set(response.data); 
    } 

    this.get = function() { 
    return data; 
    } 

    this.set = function(data_) { 
    data = data_; 
    $rootScope.$broadcast('event:data-change'); 
    } 

}); 

和控制器通信,以服务这样

$rootScope.$on('event:data-change', function() { 
    $scope.data = Data.get(); 
} 

$scope.update = function(d) { 
    Data.set(d); 
} 
+0

谢谢你的分享。我不知道如何进入我发布的代码,但似乎相关的位是“$广播”和“$上”。该服务可以在每次调用它时向控制器广播。没有一种自动或简单的方式让您的控制器在Angularjs中重新加载? – user2341148

+0

这显示了如何使用服务中的$ broadcast更新控制器。每次调用服务的set()方法时,所有侦听广播的控制器都将被更新。 –

相关问题