簡體   English   中英

如何從流星中的光標分組項目?

[英]How to group items from cursor in Meteor?

介紹。 假設我們有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]:您好嗎?
  • @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調用中轉換消息,以在Messages文檔中添加new_usernew_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>

如果這些轉換調用被阻止,則該方法應該起作用。 我找不到證據表明他們沒有這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM