Meteor JS:如何访问集合中的上一条记录?

时间:2014-06-04 02:27:18

标签: javascript mongodb meteor

我有一个集合中的消息列表。在呈现集合中的每条消息时,我想将消息的时间戳和userIds与上一条消息进行比较。但是,我不知道如何访问数据来进行比较。任何建议将不胜感激。

这是我的模板:

<template name="messageList">
  <ul>
    {{#each messages}}
      {{>messageItem}}
    {{/each}}
  </ul>
</template>

<template name="messageItem">
  <li>
    <p class="{{nameVisibility}}">{{userName}}</p>
    <p>{{body}}</p>
  </li>
</template>

这是我的帮助文件:

Template.messageItem.helpers({
  nameVisibility: function() {

    //Not sure how to query the previous message in relation to this one.
    previousMessage = Messages.findOne(...);
    if (this.userId != previousMessage.userId) {
      return false;
    else {
      return "hideName";
    }  
  }
});

2 个答案:

答案 0 :(得分:1)

预处理你正在循环的数组:

Template.messageList.helpers({
  messages: function() {
    var i, j, messages;
    messages = Messages.find({}).fetch(); // Replace `{}` with your query
    for (i = 0, j = ret.length; i < j; i++) {
      if (messages[i-i] != null && messages[i].userId == messages[i-1].userId)
        messages[i].nameVisibility = "hideName";
    }
    return messages;
  }
});

答案 1 :(得分:1)

我不同意这篇文章中的其他答案,这篇文章非常低效,需要额外的时间迭代整个Messages集合。

我认为最好的方法是使用Template.messageItem.rendered回调中的常规jQuery。您可以找到上一个元素,使用UI.getElementData查找其数据,并根据需要删除或添加用户名。在Meteor 0.8.0+(Blaze渲染引擎)上,您的编辑将会坚持下去。像这样:

Template.messageItem.rendered = function() {
  // this.firstNode is the <li> tag; .prev() grabs its previous sibling
  prevMessage = $(this.firstNode).prev();
  prevData = UI.getElementData(prevMessage[0]); // but make sure prevMessage[0] exists
  if (prevData.userName === this.data.userName)
    this.$(".username").remove(); // Make sure you put the ".username" class on the prefix
}