2014-03-19 131 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()方法時,所有偵聽廣播的控制器都將被更新。 –

相關問題