在Meteor中搜索集合时设置{reactive:false}仍会更新模板

时间:2013-03-03 15:55:52

标签: meteor reactive-programming

我有一个我在Meteor尝试的新闻提要,但是我遇到了让该死的事情表现出来的问题:)我想让它在页面加载/刷新时加载新闻提要,但不是当数据发生变化时我在文档中发现,将{reactive: false}添加到集合的find方法应该使它坚持渲染时生成的结果,但它似乎对我不起作用。 Meteor不断更新模板。

这是我得到的代码:

在服务器端:

Meteor.publish("newsfeed", function () {
    return Newsfeed.find({});
});

在客户端:

Meteor.subscribe('newsfeed');

Template.feed.feed_data = function() {
    var feed = Newsfeed.find({}, {
        sort: {updated_time: -1},
        limit: 10,
        reactive: false
    });

    return feed;
};

在模板中:

<template name="feed">
    <div id="feed-wrapper">
        <ul>
            {{#each feed_data}}
                <li>
                    <div class="message">{{message}}</div>
                </li>
            {{/each}}
        </ul>
    </div>
</template>

如果我在Dev Tools中运行Newsfeed.update({_id: 'some_random_id'}, {$set: {date_created: 'some_random_date'}}),模板会更新我的新闻Feed的排序并进行更改。

如何让它不那样做? :d

2 个答案:

答案 0 :(得分:3)

这可以说是Meteor中的一个错误。传递reactive: false意味着minimongo本身不会设置一些代码来说“观察它是否发生变化,无效”。但#each有自己独立的observeChanges调用,它直接使用observe回调(不是反应性的“invalidate and recalculate”)来更新列表。如果光标上有reactive: false,我们可能不应该这样做。在https://github.com/meteor/meteor/issues/771进行跟踪!

答案 1 :(得分:0)

有点奇怪,它应该有效。您也可以使用preserve

尝试在客户端js中添加此行

Template.feed.preserve(['#feed-wrapper']);

Btw是另一个模板中的template name="feed"?该模板中是否包含任何反应变量?