Angularjs 安圭拉酒店;Firebase应用程序分页功能不工作

Angularjs 安圭拉酒店;Firebase应用程序分页功能不工作,angularjs,firebase,Angularjs,Firebase,我正在学习一个教程,它展示了如何制作一个带有分页功能的聊天应用程序,但是由于某些原因,负责上一页和下一页分页按钮的代码并没有按预期工作 以下是Plunker中的应用程序: 每次单击“下一步”按钮时,都会在Firebase消息对象中看到从第一条开始的下一条10消息。请记住,messages对象中有28条消息。因此,当您单击“下一步”按钮一次时,您将按预期看到接下来的10条消息,但当您再次单击它时,消息列表将变为空白 因此,当我试图手动调试此函数时,我决定运行console.log(lastIte

我正在学习一个教程,它展示了如何制作一个带有分页功能的聊天应用程序,但是由于某些原因,负责上一页和下一页分页按钮的代码并没有按预期工作

以下是Plunker中的应用程序:

每次单击“下一步”按钮时,都会在Firebase消息对象中看到从第一条开始的下一条10消息。请记住,messages对象中有28条消息。因此,当您单击“下一步”按钮一次时,您将按预期看到接下来的10条消息,但当您再次单击它时,消息列表将变为空白

因此,当我试图手动调试此函数时,我决定运行
console.log(lastItem.name)
,因为这似乎是使此函数工作的关键参数。因此,您可以在控制台中看到,第一次单击“下一步”时,您将看到
-JX7ZlaB0QTa0Z47eu28的Firebase ID被记录。这是有意义的,因为它是在页面加载时返回到页面的前10个消息对象中的最后一个消息对象的名称/ID。再次单击“下一步”时,我们希望看到一个类似的消息对象名称/ID,但我们只看到记录到控制台的字符串
messages

因此,pageNext函数似乎在数据树上跳跃,从单个消息对象跳到整个消息对象。然后,当我们再次按下“下一步”时,我们会看到这个错误

TypeError: Cannot read property 'name' of undefined
    at h.$scope.pageNext (http://run.plnkr.co/plunks/zxp9wcKaMcfM2U0vAJhG/main.js:32:24)

所以它看起来像是跳转到了数据树的根,我猜它不包含任何内容。你知道为什么会发生这种情况以及如何解决吗?

你的邮件只有
用户
文本
属性

pageNext
pageBack
方法中,您将获得错误,您将获得最后一条消息并尝试读取不存在的
name
属性


我猜您是想阅读上一条消息中的
用户

pageNext
pageBack
方法中,您指的是错误的快照

当我解决这个问题时,plunker可以工作:

messageRef.startAt(null, name).limit(numberOfItems).once('value', function(snapshot) {
    snapshot.forEach(function(snapItem) {
        var itemVal = snapItem.val();
        itemVal.name = snapItem.name(); // was snapshot.name()
        messages.push(itemVal);
    });
    deferred.resolve(messages);
});

每个消息对象都有一个ID,看起来像Firebase在使用Firebase.add()方法创建时提供给它的
-JX7ZlaB0QTa0Z47eu28
,因此我尝试实际读取ID字符串。这就是它看起来的样子:{code>{“-JX7Z7Nohid6Yb4gYUL8:{“文本”:“嘿,我的名字是托马斯:)”,“用户”:“汤姆”;“-JX7ZAqK5LhMZnQbav2H:{“文本”:“哦,嘿,那里:)”,“用户”:“莎拉”},“-jx7zfffz7k78g6fkwziry:{“文本”:“嘿,汤姆怎么样了?”,“用户”:“詹纳斯”},…}
但对象上仍然没有名称属性@贾斯汀尼斯纳为您提供了一个很好的调试依据。在这里做一些尽职调查,看看他在说什么。另外,请检查数组中为什么没有元素(这就是为什么它不能在“未定义”上读取名称;lastItem未定义)。的确,每个消息对象中没有name属性,但每个消息对象都是唯一键ID字符串的值,如
-jx7z7nohid6yb4gyl8
。我不明白为什么控制台第一次记录
lastItem
会导致
-JX7ZlaB0QTa0Z47eu28
被记录,控制台记录
lastItem
第二次导致记录
消息
,控制台记录
lastItem
第三次导致
TypeError:无法读取未定义的属性“name”。因此,事实上,控制台日志记录
lastItem
第一次起作用。