Meteor JS:在处理游标时与Meteor JS不一致?

时间:2015-04-24 14:37:35

标签: javascript mongodb meteor spacebars

我想我可能在Meteor JS中发现了一些不一致的地方。 首先,这是一个完全可以接受的代码示例,它不会在Meteor JS的模板助手中引起错误:

Template.admin_menu_items.helpers({
  menuItems: function(){
    console.log('inside menuItems');
    return MenuItems.find();
  },
})

但是,如果我使用Sessions存储MenuItems.find()的返回值 e.g。

Template.admin_menu_items.rendered = function(){    
  var snapshot = MenuItems.find();
  Session.set('menu_items', snapshot);
}

然后使用模板助手中的会话中存储的对象:

Template.admin_menu_items.helpers({

      menuItems: function(){
        console.log('inside menuItems');

        //return MenuItems.find();
        return Session.get('menu_items');
      },
 })

我收到以下错误:

Exception from Tracker recompute function:
meteor....ddc0aaf (line 888)
Error: {{#each}} currently only accepts arrays, cursors or falsey values.
meteor....ddc0aaf (line 888)

badSequenceError@http://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:179:1
ObserveSequence.observe/computation</<@http://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:144:1
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:593:12
ObserveSequence.observe/computation<@http://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:121:7
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:327:5
Tracker.Computation.prototype._recompute@http://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:346:9
Tracker._runFlush@http://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:485:9
onGlobalMessage@http://localhost:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:372:11

哪个不会感觉到因为我在会话中存储了MenuItems.find()的可接受返回值并检索它....它应该仍然是检索后的光标.....对吗?< / p>

对此的解释是什么?

要强调使用Sessions存储值不会更改检索时存储的对象....我尝试了上面相同的代码,但只使用数组而不是游标......所以这是var snapshot = MenuItems.find().fetch();而不是var snapshot = MenuItems.find();而且它不会产生任何错误.......

1 个答案:

答案 0 :(得分:4)

在幕后,SessionReactiveDict。如果您查看source,您会看到它通过EJSON.stringify序列化其数据。

如果您有简单的对象和基元,这很有效,但序列化一个类实例将剥离其所有方法(函数未被序列化)。

这解释了为什么存储fetch(文档数组)的结果有效,而存储find(游标实例)的结果则不然。因为删除了游标的方法,它不再像游标一样,并且空格键将无法迭代其文档。