【发布时间】:2015-11-19 04:44:45
【问题描述】:
这个想法很简单,当记录数发生变化或将新消息插入文档时,我需要向下滚动消息提要(同样的事情)。
当前实现使用设置间隔来不断检查数据库更改:
Template['messenger'].onCreated(function(){
$(function(){
Template['messenger'].methods.scrollOnNewMessages().start();
})
});
Template['messenger'].methods = {
scrollOnNewMessages : function () {
return {
oldCount : 0,
start : function () {
this.oldCount = Messages.find().count();
setInterval(this.funcToRepeat, 400);
},
funcToRepeat : function () {
var newCount = Messages.find().count();
var updated = this.oldCount !== newCount;
if(updated){
this.oldCount = newCount;
Template['messenger'].methods.scrollDown();
}
}
}
},
scrollDown: function () {
var height = $(".messageEntry").outerHeight() + 3;
var scrollLength = $('.messageEntry').length * height - $("#messageFeed").height();
$('#messageFeed').animate({scrollTop:scrollLength}, 400, 'swing');
},
}
这很好用,但我讨厌使用 setInterval() 的想法。 尝试使用 Template.my_template.onRendered 执行此操作,但这将在每个渲染的模板上执行一个函数,这意味着如果我在启动时渲染了 50 条消息,它将自动滚动 50 次而没有太多目的。
那么你们能想出一个不使用 setInterval 的更好的 CLEAN 解决方案吗?
【问题讨论】:
标签: javascript jquery meteor meteor-blaze