介绍。假设我们有Messages集合。该集合中的每个文档都是这样的:

{
  createdAt: 1432018583531,
  message: 'Hello',
  username: 'chuk',
  chatId: '82rWv8bv4YbxEiCky'
}


呈现简单的邮件列表很容易:

<template name="messages">
  {{#each messages}}
    {{> singleMessage}}
  {{/each}}
</template>
---
Template.messages.helpers({
  messages: function () {
    return Messages.find(selector, options);
  }
});


输出可能如下所示:


  
  @chuk [5月18日上午10:00]:您好
  @geck [5月18日,上午10:01]:嗨
  @geck [5月18日上午10:01]:R U怎么样?
  @chuk [5月18日上午10:02]:好的:-)
  @chuk [5月19日,09:02 PM]:嘿?
  


题。如何按日期和作者分组消息?如何将输出转换为如下形式:


  五月18
  
  
  @chuk,上午10:00-您好
  @geck,上午10:01 —嗨,您好吗?
  @chuk,上午10:02-很好:-)
  
  
  五月19
  
  
  @chuk,晚上09:02-嘿?
  


的想法。第一个想法是通过迭代所有命令来强制使用.fetch()和消息分组:

<template name="messages">
  {{#each dateBlock}}
    {{#each messageBlock}}
      {{#each}}
        {{> singleMessage}}
      {{/each}}
    {{/each}}
  {{/each}}
</template>
---
Template.messages.helpers({
  dateBlock: function () {
    return makeDateBlocks(Messages.find(selector, options).fetch());
  },
  messageBlock: function () {
    return makeMessageBlocks(this);
  }
});


但是我认为这是一种不好的方法,因为.fetch()会导致每次更改都重新计算所有数据。增长的列表将根据元素的数量而变慢。

进行此类分组的最佳方法是什么?嘿,流星?可能是我们需要插入分隔符并根据afterFlush回调中的数据属性通过jQuery给元素添加特殊类吗?要么?

最佳答案

如果时间或用户自上一个以来已发生更改,则可以在find调用中转换消息以在new_user文档中添加new_dateMessages标志:

Template.messages.helpers({
  messages: function () {
    var lastMessage = null;
    return Messages.find({chatId: this.chatId}, {sort: {createdAt: -1}, transform: function (messageItem) {
      if (!lastMessage || lastMessage.createdAt < messageItem.createdAt.setHours(0,0,0,0))
        messageItem.new_date = true;
      else if (lastMessage.username !== messageItem.username)
        messageItem.new_user = true;
      lastMessage = {username: messageItem.username, createdAt: messageItem.createdAt.setHours(0,0,0,0)}
      return messageItem;
    }});
  }
});


然后,在您的模板中:

<template name="messages">
  {{#each messages}}
    {{#if new_date}}
      {{> messageDate}}
      {{> userAndTime}}
    {{else if new_user}}
      {{> userAndTime}}
    {{/if}}
    {{> singleMessage}}
  {{/each}}
</template>


如果这些转换调用被阻止,则该方法应该起作用。我找不到证据表明他们没有这样做。

09-07 19:56