如何让模板帮助器变为非活动状态?

时间:2015-10-18 16:50:54

标签: javascript meteor

我对Meteor很新(昨天开始)所以请耐心等待。

我有以下内容尝试从服务器获取一些消息:

var messages = new Mongo.Collection('messages');

if (Meteor.isServer) {

    //Initial first few messages 

    Meteor.publish("messages", function () {
        return messages.find({}, {sort: {createdAt : -1}, limit: 2, reactive : false});
    });
}

然后是模板的帮手:

Template.card.helpers({
    messages: function () {
        return messages.find({});
    }
});

模板:

<div class="messages-slider">
    {{#each messages}}
        {{> message}}
    {{/each}}   
</div>

我正在尝试获取前几个消息,并在DOM中保持静态 - 但是,使用上面的代码,模板随集合更新,无论如何。我如何解决它?

2 个答案:

答案 0 :(得分:1)

find的reactive选项仅限客户端。在帮助者中使用它:

Session.set('ready', false);
Meteor.subscribe('messages', { onReady: function() {
    Session.set('ready', true);
}});

Template.card.helpers({
    messages: function () {
        if (Session.get('ready')) {
            return messages.find({}, {reactive: false});
        }
    }
});

答案 1 :(得分:0)

参考克里斯蒂安的回答:

我认为您可以通过将模板包装在{{#if Template.subscriptionsReady}]中来解决预订前准备问题,以便在加载订阅之前不会渲染。在这种情况下,不需要Session个变量。例如:

Template.card.onCreated(function(){
    var instance = this;
    instance.autorun(function() {
       instance.subscribe('messages'); 
    });
});

Template.card.helpers({
    messages: function() {
        messages.find({},{reactive:false});
    }
});

模板:

<template name="card"> 
    {{#if Template.subscriptionsReady}}
        <div class="messages-slider">
            {{#each messages}}
                {{> message}}
            {{/each}}   
        </div>
    {{/if}}
</template>