2014-01-17 51 views
0

這裏檢索數據時是一個例子:http://plnkr.co/edit/Vzb3eLO341M48zE7mSDa

在現實世界中,add函數可以調用一個REST API將字符串添加到數據庫然後返回一個數組,其中包含自上次調用REST API後其他用戶添加的所有數據。與只保存本地同步陣列副本相比,您將擁有「更完整」的列表。

在DataService.getDataArray()中,我們返回一個帶默認值的本地數組。當控制器初始化時,該功能顯然被調用一次。

由於我們失去了指向masterArray的指針,在angularjs方式下,如何讓範圍知道我們需要再次調用getDataArray?這是否必須手動完成?是否應該有數組更新的事件?

我知道有很多潛在的「這只是有效」的解決方案,但我只對angularjs方式感興趣,以解決保持數據同步的問題。從外部來源返回的數據。

+1

可否請你澄清,你是什麼失去指針masterArray是什麼意思? –

+1

爲什麼你必須失去指向'masterArray'的指針?你爲什麼不更新數組? – gkalpak

+0

我在想這可能是錯誤導致數組指針丟失的原因。如果可能,我想避免這種情況。如果不合理,那麼我寧願告訴隊友和我自己編碼,假設「這個數組的指針非常重要,不會丟失它」。我的許多同事都不會意識到這會發生,它會引起很多混亂 – bobber205

回答

1

如果我正確地理解了你,你只希望範圍監視服務中的數據更改?你可以使用$watch來做到這一點。此外,如果數據同步是一個問題,您可以考慮輪詢更新,而不是依賴於由用戶自己添加值而導致的更新。

例如:

.controller('MainCtrl', function($scope, DataService) { 

    DataService.startPolling() 

    $scope.$watch(function() { return DataService.getDataArray() }, function(data) { 
     $scope.someData = data 
    }) 

    $scope.addAction = function(data) { 
     DataService.add(data) 
    } 
}) 

.factory("DataService", function($http, $interval) { 
    var masterArray = ["0"], 
     intervalID 

    function pollForNewValues() { 
     $http.get(...).then(response) { 
      // push new values to masterArray 
     }) 
    } 
    function saveVal(value) { 
     $http.post(...).then(response) { 
      // push new values to masterArray 
     }) 
    } 
    return { 
     add: function(whattoadd) { 
      saveVal(whattoadd) 
     }, 
     getDataArray: function() { 
      return masterArray; 
     }, 
     startPolling: function() { 
      intervalID = $interval(function() { 
       pollForNewValues() 
      }, 5000) 
     }, 
     stopPolling: function() { 
      $interval.cancel(intervalID) 
     } 
    } 
}) 
+0

每5秒輪詢一次數據真的是最好的方式嗎?我在我們的一個網站中也使用這種方法,但是當您在多個選項卡中打開該網站時,每個選項卡都會提取所有數據,並且輪詢變得更加激烈。沒有辦法讓這個更高效嗎? – Wouter

相關問題