【问题标题】:Alternative for setInterval() database checking -> Meteor.jssetInterval() 数据库检查的替代方法 -> Meteor.js
【发布时间】: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


    【解决方案1】:

    您可以在 onRendered 回调中使用 autorun

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

    由于计数是反应性的,autorun 将在每次更改时触发。尝试添加并删除 scrollOnNewMessages 及其在 onCreated 中的引用。

    【讨论】:

    • 为什么要使用 onRendered 而不是 onCreated?附言很好的答案。谢谢!
    • 我认为onRendered 在这里更有意义,因为我们正在处理 DOM 元素。如果使用onCreated,则可以在模板渲染之前调用scrollDown
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多