Meteor JS: Timing of Accessing MongoDB 影响访问结果

Meteor JS: Timing of Accessing MongoDB affects the result of the Access

我的 Meteor JS 应用程序中有一个集合:

MenuItems = new Mongo.Collection('menu_items');

在我的模板助手文件中,我访问了这个集合:

Template.admin_menu_items.helpers({

  menuItems: function(){
    //return items from DB
    console.log('inside menuItems');

    snapshot = MenuItems.find().fetch();

    console.log(snapshot);

    return snapshot;

  },
});

然后在我的 html 模板文件中调用这个助手:

{{#each menuItems}}
  {{#each items}}
    {{this}}
  {{/each}}

{{/each}}

然后在我的模板渲染助手回调部分我再次访问该集合:

Template.admin_menu_items.rendered = function(){

  console.log('Template.admin_menu_items.rendered');

  var snapshotRendered = MenuItems.find().fetch();
  //
  console.log(snapshotRendered);


}

如果我刷新页面,我会得到以下输出:

inside menuItems                    admin_m...4d3e6ec (line 9)
[]                                  admin_m...4d3e6ec (line 13)
Template.admin_menu_items.rendered  admin_m...4d3e6ec (line 36)
[]                                  admin_m...4d3e6ec (line 40)
inside menuItems                    admin_m...4d3e6ec (line 9)
[Object { _id="nHZBfwAt64dwiPjCB",  items=[3]}]

我想了解和询问的是:为什么在menuItems helper中第一次调用MenuItems.find().fetch()和Template中第一次调用MenuItems.find().fetch()渲染回调函数return当 MenuItems 集合中已有文档时,它是一个空的 [] 数组???

是否因为我的模板和模板辅助文件在文件层次结构中更深,因此比我的 menu_item.js 文件更早加载,该文件通过以下方式实例化 MenuItems 变量:

MenuItems = new Mongo.Collection('menu_items');

我如何确保 MongoDB 将 return 从最初的调用或访问中获得正确数量的文档???

非常感谢

How do I ensure that the MongoDB will return the right number of documents from the very initial call or access done to it???

好吧,在流星精神中……你没有。

Meteor 的全部特点是反应性。您不想 等待 数据到达以开始呈现。这意味着您的用户在看到某些操作之前会在空白页面上观看一段时间,因为该页面会阻止呈现,在黑暗的遗忘中等待 完整数据。

相反,你追求的是反应性。您执行立即执行的 reactive computations ,然后每次它们内部的反应数据更新。助手是反应式计算,Mongo Meteor 中的游标是反应式数据。 Helpers 最初是 运行(可能因为数据还没有到达而什么都不返回),然后每次都有新数据进来。

在对这些反应式计算进行编码时,您必须考虑 "Nope, no data yet" 的情况。例如,if(someCollection.findOne()) 将确保 someCollection.
中至少有一个文档 在你的情况下,它可能并不是很有用,因为 Spacebars 可以很好地处理游标。

与文件的加载顺序相比,这更多地与订阅和在线数据有关。刷新页面时,先获取模板,后获取数据,所以操作顺序是这样的:

  1. 模板在没有数据的情况下开始自行构建,因此助手以空数组运行
  2. 模板已完成构建和呈现,但没有数据,它也有一个空数组
  3. 数据到达
  4. 助手用新数据重新运行,return一个完整的数组

如果您需要呈现回调中的数据,解决此问题的方法是在数据到达之前阻止此模板 运行。您可以使用等待订阅的路由器来处理此问题,或者通过检查数据并仅在项目数量不为零时才呈现模板,或者使用 Template.subscribe 函数并使用 [= 保护您的模板10=]语句,直到数据准备好。

附带说明一下,您可能希望 return 在您的助手中 find() 的结果而不是 find().fetch(),它在 [=13= 中的效果相同] 块,但具有更细粒度的反应性,因为 Blaze 可以遍历游标本身。当然除非你真的需要数组。