2017-05-14 264 views
0

我試圖延遲加載Firebase項目,以便稍後加載更多的用戶,無論用戶何時到達div容器的末端。當我刪除.endAt().startAt()我收到了15件物品,雖然它們沒有增加,並且卡住了這15件物品。Firebase延遲加載

當我保持.endAt().startAt()我收到火力警告 Using an unspecified index. Consider adding ".indexOn": "title" at /items即使.indexOn設置。我被這個警告弄糊塗了。預先感謝您的幫助。

火力地堡結構

{ 
    "items" : { 
    "-Kk6aHXIyR15XiYh65Ht" : { 
     "author" : "joe", 
     "title" : "Product 1" 
    }, 
    "-Kk6aMQlh6_E3CJt_Pnq" : { 
     "author" : "joe", 
     "title" : "Product 2" 
    } 
    }, 
    "users" : { 
    "RG9JSm8cUndpjMfZiN6c657DMIt2" : { 
     "items" : { 
     "-Kk6aHZs5xyOWM2fHiPV" : "-Kk6aHXIyR15XiYh65Ht", 
     "-Kk6aMTJiLSF-RB3CZ-2" : "-Kk6aMQkw5bLQst81ft7" 
     }, 
     "uid" : "RG9JSm8cUndpjMfZiN6c657DMIt2", 
     "username" : "joe" 
    } 
    } 
} 

安全規則

{ 
    "rules": { 
    ".read": true, 
    ".write": "auth != null", 
    "users":{ 
     "$uid": { 
     ".write": "$uid === auth.uid" 
     "items":{ 
      ".indexOn": "title", 
      "$itemId": { 
      "title": {".validate": "...} 
      "type": {".validate": "...} 
      } 
      } 
     } 
     } 
    } 
    } 
} 

代碼結構延遲加載

let _start = 0, 
    _end = 14, 
    _n = 15; 

function lazyLoadItems(){ 
    firebase.database().ref('items') 
     .orderByChild('title') 
     .startAt(_start) 
     .endAt(_end) 
     .limitToFirst(_n) 
     .on("child_added", snapshot=> console.log(snapshot.val())); 
    _start += _n; 
    _end += _n; 
} 
+0

當您向'/ users/$ uid/items'添加索引時,您正在查詢'/ items'。 –

+0

嗯,是的,雖然我想列出所有用戶的所有項目,所以查詢'/ users/$ uid/items'而沒有'uid'將無法完成這項工作。在''rules「中加入'.indexOn('items')'沒有任何意義。難道這是嚴格的規則嗎? – nehel

+0

這是不可能與你分享的東西說。 JSON的最小片段可能會有所幫助。您可以通過點擊[Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data)中的「導出JSON」鏈接來獲取此信息。 –

回答

1

你誤會火力地堡查詢的工作。這是最容易看到,如果你使用硬編碼值:

firebase.database().ref('items') 
    .orderByChild('title') 
    .startAt(0) 
    .endAt(14) 
    .limitToFirst(15) 

沒有與title=0title=14沒有項目,因此查詢不匹配任何東西。

Firebase數據庫查詢與您訂購的屬性值相匹配。因此,當您通過title訂購時,您在startAtendAt中指定的值必須是標題。例如。

ref.child('items') 
    .orderByChild('title') 
    .startAt("Product 1") 
    .endAt("Product 1") 
    .limitToFirst(15) 
    .on("child_added", function(snapshot) { console.log(snapshot.val()); }); 

見的這個工作樣例:http://jsbin.com/hamezu/edit?js,console

要實現分頁,你必須要記住的前一頁的最後一個項目,並把它傳遞到下一個電話:startAt(titleOfLastItemOnPreviousPage, keyOfLastItemOnPreviousPage)

+0

現在有道理的哦。對NoSQL世界來說仍然是新的,儘管它澄清了一切! – nehel