2014-10-29 50 views
0

我在應用程序中使用angularfire和firebase使用angularfire。我有一些文本文件存儲在firebase中。我想採取所有這些文件,並返回這些文件中的所有段落的數組進行角度操縱。延遲返回變量,直到從Firebase同步數據

我創建了一個服務,它將firebase中的數據與變量文檔進行同步。該服務具有以下功能將其更改爲段落數組。

getParas: function(){ 
    var paras = []; 
    for(var i=0;i< documents.length;i++){ 
     paras = paras.concat(documents[i].text.split('\n')); 
    } 
    return paras; 
} 

但是由於數據需要從firebase進行同步,所以函數在對para變量進行更改之前返回。

我試過使用documents.$loaded().then(function(){...但我不確定如何從getParas()函數返回此結果。

我見過article,但過濾器似乎不是最好的選擇呢?

感謝

馬修

回答

1

由於這是不是問題,我要忽視的事實是你應該只儲存在一個單獨的路徑中的段落,所以你可以獲取他們準備好了,而不是通過去這是每次讀取時解析它們的額外步驟。但我會指出,將數據存儲起來將如何讀取它是向正確方向邁出的重要一步。

由於多種原因,使用$ loaded在這裏不正確。首先,您已經獲取了動態的實時數據,並將其轉換爲靜態資產,並且在源數據更改時不會更新。不妨將它存儲在Web服務器上的一個文件中,並在這種情況下使用HTTP獲取它。其次,利用$ loaded()通常意味着你正在爲自己創建額外的工作,並試圖對AngularFire已經做得很好的事情進行微觀管理,比如管理異步下載和操作同步數組中的數據。

很可能,您只是想使用$extendFactory在數組原型上創建一個附加方法。

// create a factory that has a getParas method 
app.factory('ListFactory', function($FirebaseArray) { 
    return $FirebaseArray.$extendFactory({ 
     getParas: function() { 
      var paras = []; 
      for(var i=0; i < this.$list.length; i++){ 
       paras = paras.concat(this.$list[i].text.split('\n')); 
      } 
      return paras; 
     } 
    }); 
}); 

// create the synchronized list 
app.factory('List', function(ListFactory, $firebase) { 
    return function(ref) { 
     return $firebase(ref, {arrayFactory: ListFactory}).$asArray(); 
    } 
}); 

app.controller('ctrl', function(List, $window, $scope) { 
    var ref = new $window.Firebase(URL); 
    $scope.list = List(ref); 
}); 

然後在您的視圖,只是引用新的方法:

<pre> 
{{list.getParas()|json}} 
</pre> 
+0

謝謝 - 你說對了,我最好以我想要檢索的格式分開存儲。我想我會嘗試。 – mrmjct 2014-10-30 10:47:09

2

你有兩個選擇。

  1. 解決「文檔」變量頁面加載 路線之前。
  2. 使用承諾,並確保數據設置爲「文檔」變量後調用「getParas」爲 。

下面是一個承諾的解決方案,它可以在控制器中完成所有工作,您可以從此開始,然後嘗試將其合併到您的服務中。

.controller("YourCtrl", ["$scope", "$q", function($scope, $q){ 
    var promise = getFB(); 
    promise.then(function(){ 
    afterPromise(); 
    }) 

    function getFB(){ 
    var documentRef = new Firebase("YOURFIREBASERURL/documents") 
    var fireDataDef = $q.defer() 

    documentRef.once("value", function(snapshot){ 
     $scope.documents = snapshot.val(); 
     fireDataDef.resolve(); 
    }) 
    return fireDataDef.promise; 
    } 
function afterPromise(){ 
    var $scope.paras = []; 
    for(var i=0;i< $scope.documents.length;i++){ 
     $scope.paras = $scope.paras.concat(documents[i].text.split('\n')); 
    } 
    } 
}] 
+0

偉大的想法,使用路線和解決!有關此文檔的更多信息,請訪問:https://www.firebase.com/docs/web/libraries/angular/guide.html#section-routes – Kato 2014-10-30 05:21:15

+0

感謝您的幫助。 – mrmjct 2014-10-30 10:48:30