我有一个聊天应用程序。消息存储在Mongo集合中,其中包含以下字段:
# Messages
# body: string
# nick: string
# room_name: string
# timestamp: timestamp
当我渲染聊天室时,如果消息跟随同一用户的消息,我想对消息应用特殊样式。但是如果我使用标准模板迭代器(这是CoffeeScript):
Template.messages.helpers
messages: -> model.Messages.find()
isFollowUp: -> /* some code here? */ false
在模板中(简化):
{{#each messages}}<p class-"{{isFollowUp}}">{{nick}}: {{body}}</p>{{/each}}
然后在isFollowUp
帮助器中,我可以访问当前消息,但不能访问上一条消息。理想情况下,我可以做类似的事情:
isFollowUp: -> if this.nick == this.previous().nick then "followup" else ""
重要:页面上有很多消息,每次新消息到达时我都无法重新呈现整个页面。有一个简单的解决方案,如:
messages: -> model.Messages.find().fetch().map (v,i,a) ->
prev: a[i-1]
curr: v
next: a[i+1]
但这会消除Blaze中的特殊{{#each}}
依赖(通过将数组而不是Cursor传递给模板),因此每当有新消息到达时都会强制重新呈现整个页面。
我正在寻找的解决方案必须避免重新发送所有消息。当新消息到达时,只应重新呈现该消息及其前面的消息。