介绍。假设我们有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_date
和Messages
标志:
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>
如果这些转换调用被阻止,则该方法应该起作用。我找不到证据表明他们没有这样做。