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

3

我认为在Meteor JS中可能存在一些不一致的问题。 首先,以下是一个完全可接受的代码示例,在Meteor JS的模板助手中不会导致错误:

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

然而,如果我使用会话(Sessions)来存储MenuItems.find()返回的值,例如:

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');
      },
 })

I get the following error:

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()的可接受返回值存储在Session中并检索它... ... 检索后应该仍然是一个游标.....对吧?
这是什么解释?
为了强调使用Session存储值时,检索到的存储对象不会发生更改......我尝试了上述相同的代码,但只使用数组而不是游标......所以是var snapshot = MenuItems.find().fetch();而不是var snapshot = MenuItems.find();,这样就不会产生任何错误... ...
1个回答

4
在底层,Session是一个ReactiveDict。如果你查看源代码,你会发现它通过EJSON.stringify序列化数据。
如果你有简单的对象和基本类型,这种方法很有效,但是序列化一个类实例将剥离所有它的方法(函数不被序列化)。
这就解释了为什么存储fetch(文档数组)的结果有效,而存储find(游标实例)的结果无效。因为游标的方法被移除,它不再像游标那样工作,Spacebars将无法迭代其文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接