Meteor中的反应性是否受到查询中所选字段的影响?

时间:2016-01-11 14:02:54

标签: mongodb meteor

如果我的用户界面取决于

MyCollection.find({_id: "..."})

我知道只要该文档中的任何字段发生变化,它就会触发反应。但是,如果我只从该文档中选择一个字段:

MyCollection.find({_id: "..."}, {fields: { MyAttr: 1 }})

对于具有该_id的文档的任何更改是否会触发反应性,还是只会在对该文档的MyAttr字段进行更改时触发反应?

1 个答案:

答案 0 :(得分:1)

我做了一个简单的测试来确定这个:

的test.html:

<template name="test">
  {{ #if Template.subscriptionsReady }}
    {{ GetMyAttr }}
  {{ /if }}
</template>

test.js:

Template.test.helpers({
  GetMyAttr: function() {
    console.log('called GetMyAttr');
    return MyCollection.findOne({_id: "jpBLBgCyEi3XpicxF"}).MyAttr;
  }
});

Template.test.onCreated(function() {
  this.subscribe("my_collection");
});

现在,当我在&#34; jpBLBgCyEi3XpicxF&#34;上手动更新MyOtherAttr时文档called GetMyAttr已记录到控制台。但是,如果我将find语句更改为:

return MyCollection.findOne({_id: "jpBLBgCyEi3XpicxF"}, {fields: {MyAttr: 1}}).MyAttr;

然后更新&#34; jpBLBgCyEi3XpicxF&#34;上的MyOtherAttr文献  不会导致called GetMyAttr被打印。

  

结论:游标仅对这些游标中返回的数据的变化做出反应。

回想起来,这显然应该是那样的。我认为这是更经常使用查询的{fields: {}}部分的一个很好的理由,以减少不必要的反应。