【问题标题】:Angularjs automatically refresh controllers using Shared ServiceAngularjs 使用共享服务自动刷新控制器
【发布时间】:2014-03-19 12:34:10
【问题描述】:

经过大量研究,我找到了以下答案,它与我的代码非常匹配,并清楚地解释了如何使用共享服务(使用缓存和承诺)在控制器之间共享数据。

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    我从服务中拍摄了一个事件。有点像这样。

    .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);
    }
    

    【讨论】:

    • 谢谢分享。我不确定它是如何进入我发布的代码的,但相关位似乎是“$broadcast”和“$on”。该服务可以在每次调用它时向控制器广播。难道没有一种自动或简单的方法可以让你的控制器在 Angularjs 中重新加载吗?
    • 这显示了如何使用服务中的 $broadcast 更新控制器。任何时候调用服务的 set() 方法,所有监听广播的控制器都会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多