2016-07-22 50 views
0

我是Angular-Firebase開發的新手,我在理解如何檢索嵌套在兩個集合中的數據時遇到問題。 我有一個名爲「訂單」的集合,其中包含一個字段調用「auth」,這是用戶ID,我有另一個集合是「用戶配置文件」,它的$ id是「auth」的值。在用戶配置文件中,我有一個名爲roomNumber的字段,它的內容是我每次讀取時都要檢索的內容,以ng-重複訂單。如何檢索嵌套在兩個集合從角落的火力基地

在我看來,我試圖做這樣的事情:

<tr ng-repeat="item in items | filter: searchKeyword "> 
    <td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr> 

roomNumber是一個函數在我的控制器

$scope.roomNumber = function(id) { 
var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + id); 
    $scope.userdet = $firebaseArray(rootRef); 
    rootRef.on("value", function(rootSnapshot) { 
     var key = rootSnapshot.key(); 
     var childKey = rootSnapshot.child("room").val(); 
     console.log("room ", childKey) 
    }); 
return childKey 
    } 

當我運行此代碼,請參閱我的js控制檯的結果,奇怪的事情發生: 1.它重複很多次 2.我永遠不可能得到childKey值

我一直在讀F irebase文檔,但我真的不明白如何做這個「愚蠢」的事情,有沒有人給我一個如何做到這一點的小費?

enter image description here

+0

它的另一個firebase數據集合 – CaribeSoft

回答

1

當你將函數綁定到$ scope並在h內調用它tml期望在被調用時馬上得到答案。所以當你查詢firebase時,它需要它的甜蜜時間讓你回答一個答案,angularjs已經從函數中得到了一個未定義的答案。

所以發生了什麼事情是,當你提供函數給rootRef.on時,你註冊了一個回調函數,然後在你註冊了回調函數之後,你正在返回childKey的值。不幸的是,childKey只能由回調函數設置(firebase尚未執行)。因此,angularjs從你的roomNumber函數中得到一個未定義的答案。

爲了使這項工作,你將不得不提前拿到房號,然後可能將它們添加到每個$ scope.items您的項目,然後使用

<td align="left">{{item.$id}} - {{item.room}}</td></tr> 

代替

<td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr> 

要加載的房間號碼全部,你可以這樣調用一個函數的一些後$ scope.items加載

for (var i = 0; i < $scope.items.length; i++) { 
    var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + $scope.items[i].$id); 
    $scope.userdet = $firebaseArray(rootRef); 
    rootRef.on("value", function(rootSnapshot) { 
     var key = rootSnapshot.key(); 
     var childKey = rootSnapshot.val().room; 
     $scope.items[i].room = childKey; 
    }); 
} 

它會改變每個項目以引用房間。不幸的是,該列表不會隨着數據更新而更新,所以更好的解決方案是在任何函數從服務器獲取項目時執行相同的查詢,並在將每個項目添加到項目列表中時將空間添加到每個項目。

+0

謝謝戴維斯,你的評論讓我覺得與衆不同,首先我注意到一個錯誤,我在參考中聲明瞭chilKey作爲全局變量,所以我在firebase參考之前將其解釋爲它,並且它工作正常。此外,我對我的應用程序進行了更改,我將該房間字段保存在「訂單」集合中,這種方式在瀏覽數據時很容易獲得。 – CaribeSoft

+0

我很高興它的工作。對不起,我沒有提供完整的答案,但我試圖脫離您提供的代碼。 – Davis

0

要與childKey不讀修正這個問題,你需要使用:

var childKey = rootSnapshot.val().room; 

,而不是這樣的:

var childKey = rootSnapshot.child("room").val(); 
console.log("room ", childKey) 

參考:https://www.firebase.com/docs/web/guide/retrieving-data.html

+0

嗨,弗蘭克,感謝您的快速響應,但它仍然沒有返回childKey的值,那就是房間。您是否認爲使用此方法是一種很好的做法: {{item。$ id}} - {{roomNumber( item。$ id)}} ?,我正在閱讀另一篇文章,說這種方式佔用了服務器的大量資源,這是真的嗎? – CaribeSoft

+0

我實際上並沒有完全弄清楚當我第一次發佈我的答案時你問的問題。我將很快發佈一個新的答案,希望能更好地闡明。 – Davis