[英]Alternative for setInterval() database checking -> Meteor.js
這個想法很簡單,當記錄數更改或將新消息插入doc(相同的東西)時,我需要向下滾動消息饋送。
當前實現使用設置間隔來繼續檢查數據庫更改:
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解決方案嗎?
您可以在onRendered
回調中使用自動運行 :
Template.messenger.onRendered(function() {
this.autorun(function() {
if (Messages.find().count())
Template.messenger.methods.scrollDown();
});
});
由於計數是反應性的,因此autorun
將在每次更改時觸發。 嘗試添加該內容並刪除onCreated
scrollOnNewMessages
及其引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.