如何让模板帮助器变成非响应式的?

How do I get a template helper to become non reactive?

本文关键字:响应 帮助      更新时间:2023-09-26

我是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中的静态,基本上-然而,与上面的代码模板更新与集合不管。我怎么修理它?

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});
        }
    }
});

参考Christian的回答:

我认为你可以通过在{{#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>