Javascript 火基惰性负载

Javascript 火基惰性负载,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我试图延迟加载firebase项,以便在用户到达div容器末尾时加载更多项。当我删除.endAt()和.startAt()时,我收到了这15个项目,尽管它们没有增加,而是停留在这15个项目上 当我保持.endAt()和.startAt()时,我收到firebase警告 使用未指定的索引。考虑添加“.Noxon”:“标题”在/项项< /C> > > 。我被那个警告弄糊涂了。提前感谢您的帮助 火基结构 { "items" : { "-Kk6aHXIyR15XiYh65Ht" : {

我试图延迟加载firebase项,以便在用户到达div容器末尾时加载更多项。当我删除
.endAt()
.startAt()
时,我收到了这15个项目,尽管它们没有增加,而是停留在这15个项目上

当我保持
.endAt()
.startAt()
时,我收到firebase警告
使用未指定的索引。考虑添加“.Noxon”:“标题”在/项项< /C> > > <代码>。我被那个警告弄糊涂了。提前感谢您的帮助

火基结构

{
  "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;
}

您误解了Firebase查询的工作方式。最容易看出是否使用硬编码值:

firebase.database().ref('items')
    .orderByChild('title')
    .startAt(0)
    .endAt(14)
    .limitToFirst(15)
没有
title=0
title=14
的项,因此查询与任何内容都不匹配

Firebase数据库查询与您订购的属性值匹配。因此,按
title
订购时,在
startAt
endAt
中指定的值必须是标题。例如

ref.child('items')
   .orderByChild('title')
   .startAt("Product 1")
   .endAt("Product 1")
   .limitToFirst(15)
   .on("child_added", function(snapshot) { console.log(snapshot.val()); });
请参阅,以了解该系统的工作示例:


要实现分页,您必须记住上一页的最后一项,并将其传递给下一个调用:
startAt(titleOfLastItemOnPreviousPage,keyOfLastItemOnPreviousPage)

您误解了Firebase查询的工作方式。最容易看出是否使用硬编码值:

firebase.database().ref('items')
    .orderByChild('title')
    .startAt(0)
    .endAt(14)
    .limitToFirst(15)
没有
title=0
title=14
的项,因此查询与任何内容都不匹配

Firebase数据库查询与您订购的属性值匹配。因此,按
title
订购时,在
startAt
endAt
中指定的值必须是标题。例如

ref.child('items')
   .orderByChild('title')
   .startAt("Product 1")
   .endAt("Product 1")
   .limitToFirst(15)
   .on("child_added", function(snapshot) { console.log(snapshot.val()); });
请参阅,以了解该系统的工作示例:


要实现分页,您必须记住上一页的最后一项,并将其传递给下一个调用:
startAt(titleOfLastItemOnPreviousPage,keyOfLastItemOnPreviousPage)

您正在查询
/items
,同时向
/users/$uid/items
添加了索引,虽然我想列出所有用户的所有项目,但是在没有
uid
的情况下查询
/users/$uid/items
将无法完成此任务。在
“规则”
中添加
.indexOn('items')
没有意义。那么,这可能是结构糟糕的规则吗?这不可能用你分享的东西来说明。一小段JSON可能会有所帮助。您可以通过单击.Where
items
==
deck
中的“导出JSON”链接来获得此信息。我在问题中添加了JSON。但是里面没有
/项目
。请提供一个单独的链接(阅读关于为什么这是一种比我们一直以来的往返更有效的获取帮助的链接)。您正在查询
/items
,同时您向
/users/$uid/items
添加了一个索引。嗯,是的,尽管我想列出所有用户的所有项目,因此,在没有
uid
的情况下查询
/users/$uid/items
将无法完成此任务。在
“规则”
中添加
.indexOn('items')
没有意义。那么,这可能是结构糟糕的规则吗?这不可能用你分享的东西来说明。一小段JSON可能会有所帮助。您可以通过单击.Where
items
==
deck
中的“导出JSON”链接来获得此信息。我在问题中添加了JSON。但是里面没有
/项目
。请提供一个单一的(阅读链接,了解为什么这是一种比我们一直以来的往返更有效的获得帮助的方式)。哦,这现在是有意义的。对NoSQL世界来说仍然是新的,尽管这澄清了一切!哦,这现在说得通了。对NoSQL世界来说仍然是新的,尽管这澄清了一切!