2015-11-18 65 views
0

這個想法非常簡單當記錄數量發生變化或新消息插入到doc(同一事物)時,我需要做向下滾動的消息饋送。setInterval()數據庫檢查的替代方法 - > Meteor.js

當前實現使用設定的時間間隔,以保持檢查數據庫的變化:

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次而沒有太多目的。

所以你們可以想到一個更好的CLEAN解決方案,而不使用setInterval?

回答

2

你可以只使用一個autorunonRendered回調的內部:

Template.messenger.onRendered(function() { 
    this.autorun(function() { 
    if (Messages.find().count()) 
     Template.messenger.methods.scrollDown(); 
    }); 
}); 

,由於計有反應,autorun將觸發每次改變時間。嘗試添加並刪除scrollOnNewMessages及其參考onCreated

+0

你爲什麼使用onRendered而不是onCreated? P.S.很好的答案。謝謝 ! –

+0

我認爲'onRendered'在這裏更有意義,因爲我們正在處理DOM元素。如果你使用'onCreated',那麼可以在模板被渲染之前調用'scrollDown'。 –

相關問題