我有一个集合中的消息列表。在呈现集合中的每条消息时,我想将消息的时间戳和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";
}
}
});
答案 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
}