设置{reactive:false}会导致{{#each}}中断?

时间:2014-12-15 13:24:32

标签: meteor

我不确定我是否误解了某些内容应该如何工作,但每当我将反应设置为false时,它似乎会在我的模板中打破{{#each}}循环。

我可以通过一个简单的例子重新创建一个新的meteor应用程序,保留autopublish等完整,然后是以下代码:

.js文件:

Numbers = new Mongo.Collection('numbers');

if (Meteor.isClient) {
  Template.hello.helpers({
    number: function() {
      return Numbers.find({},{reactive:false});
    }
  });
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    if (Numbers.find().count() === 0) {
      for (var i = 0; i < 100; i++)
        Numbers.insert({number: i});
    }
  });
}

.html文件

<head>
</head>

<body>
  {{>hello}}
</body>

<template name="hello">
    {{#each number}}
      {{this.number}}
    {{/each}}
</template>

在上面的例子中,没有打印任何内容。如果我删除{reactive:false},则按预期打印数字。

1 个答案:

答案 0 :(得分:-1)

你的代码无法运作;这不是{reactive: false}的目的。这对于订阅是有意义的。

这里发生的是以下步骤:

  • 应用程序启动
  • 呈现模板并转到Numbers helpers,它返回任何内容,因为它没有从服务器收到任何内容
  • 而且......就是这样

你想看到的是什么:

  • 应用程序启动
  • 呈现模板并转到Numbers helpers,它返回任何内容,因为它没有从服务器收到任何内容
  • 因为您没有添加{reactive: false}选项,所以每次从服务器收到内容时,都会重播计算并更新模板

如果添加会触发计算的内容,它将起作用:

if (Meteor.isClient) {
  Meteor.subscribe('numbers');
  Template.hello.helpers({
    number: function() {
      var n = Numbers.find().fetch();
      return Numbers.find({},{reactive:false}).fetch();
    }
  });
}

现在可以正常工作,因为当{Number.find()游标发生变化时会触发var n = Numbers.find().fetch();

但这没有多大意义。告诉我你想要达到的目标。

(我敢打赌,你真正想做的事情就更像是这样:Meteor.subscribe('numbers', {reactive:false});并让帮助者做出反应。

我为你制作了一个快速的流星垫:http://meteorpad.com/pad/4zJTtdLnWcWXLuEuj/collection_reactivity