将元素添加到集合和反应性

时间:2014-08-21 09:03:27

标签: collections meteor

将文档添加到已发布的集合时,预期的反应行为是什么?更具体一点:向集合添加文档是否会使对该集合的所有预订无效(即使是那些不匹配的预订)并导致重新呈现所有相关的ui元素?

这就是我现在所经历的,至少。

更具体一点:我有表格,有些正常"字段,但也列出。这些列表包含也包含字段的子表单。两种类型的表单都存储在单个通用数据集合中。此数据集合的视图使用细粒度订阅进行管理。

当我向基本表单添加新的列表元素,新的子表单时,将重新呈现整个基本表单。甚至没有相关的基本形式被重新渲染。

我有一个github repo显示这个,虽然有点混淆。它是一个电影数据库。您可以添加电影,为其命名,标语以及向电影添加演员。演员有名字和家。将角色添加到电影中时,每个电影都会重新渲染。

https://github.com/Crenshinibon/fields3/tree/462a9291bfc400a2731c21d2debdd4071be764ed

我知道这个问题:Understanding Meteor Publish / Subscribe并且认为这部分实际上是缺失的。 (我只是没有足够的声望点在评论中提问)我认为我很了解Meteor的Pub / Sub机制。只是由此产生的反应行为有点不清楚。

我也知道这个问题:Reactivity, isolation, and lists。但Spark和Blaze的变化很大(特别是它使#isolate过时了。)

在我重建我的应用程序之前(再次)将各种形式(甚至属性)放在不同的集合中以避免整个页面"被重新加载,我想我可能会问,也许有一些我不知道的事情。

我在0.9.0-rc10。

1 个答案:

答案 0 :(得分:0)

您不应将订阅调用放在Meteor.autorun中。

  

Meteor.autorun是一个反应性上下文,意味着如果内部的反应数据源发生变化,内部的所有内容都将重新运行。我们在“current_channel”下存储我们所在的会话频道。如果该会话值发生更改,则会续订订阅,并且我们可以访问不同的消息!   src

而是在你的javascript中执行类似的操作:

Template.viewContent.movies = function () {
    var subscription = Meteor.subscribe('movies');
    return {
        data: Movies.find(),
        ready: subscription.ready
    };
}

然后您的模板将如下所示:

 {{#each movies}}
      {{#if ready}}
           {{#each data}}
               #DOSOMETHING WITH THE MOVIES#
           {{/each}}
      {{else}}
           !!!Loading indicator here!!!
      {{/if}}
 {{/each}}