我正在使用Meteor v0.9.1.1
填充小型即时消息应用。
这是我的chat_box
模板:
<ul>
{{#each messages}}
<li class="msgLine">
<strong style="color: {{userTextColor userId}}">
{{userEmail}}
</strong>
{{userMsg}}
<span>
{{createdAt}}
</span>
</li>
</ul>
我想要做的是,当用户打开此模板时,将关注最后一条消息行。所以我通过使用:
来做到这一点Template.chat_box.rendered = function(){
var $chat = $(".chatBox"); // get the div contains the messages list
$chat.scrollTop($chat.height());
};
但它没有用。通过逐步调试,我发现Template.chat_box.rendered
函数在DOM初始化之后运行,而不是从服务器加载所有消息。< / p>
所以问题是,我怎么知道所有消息何时完全加载到模板中,以便之后我可以正确运行$chat.scrollTop($chat.height());
。
这就是我通过发布/订阅获取消息列表的方式:
Meteor.subscribe('rooms_by_id', this.params._id);
var currentRoomInfo = Rooms.find().fetch()[0];
if (currentRoomInfo) {
Meteor.subscribe('messages_by_room', this.params._id);
var _messages = Messages.find().fetch();
if (_messages){
return {
roomId: currentRoomInfo._id,
roomTitle: currentRoomInfo.title.toUpperCase(),
messages: _messages
}
}
}
我已经被困在这个问题上好几个小时了。任何帮助将非常感激。谢谢你们先进的人!
答案 0 :(得分:1)
您可以使用此处描述的技术: Meteorjs loading message
但是在你的情况下你应该做些改进:
Template.chat_box.rendered = function(){
Tracker.autorun(function(){
// every time "chatBoxSubscriptionCompleted" is changed, then closure is rerun
Session.get("chatBoxSubscriptionCompleted");
var $chat = $(".chatBox");
$chat.scrollTop($chat.height());
})
};
将onReady
回调传递给Meteor.subscribe
:
Meteor.subscribe(
"chatData",
param1,param2,
{
onReady:function(){
Session.set("chatBoxSubscriptionCompleted",true)
},
onError:function(){}
}
)
每当更改Session.get("chatBoxSubscriptionCompleted")
时,Tracker.autorun
中的闭包正在执行。