javascript - meteor JS : Inconsistency with Meteor JS when dealing with cursors?

标签 javascript mongodb meteor spacebars

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

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

但是,如果我使用 session 来存储 MenuItems.find() 的返回值 例如

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

然后在Template Helper中使用Session中存储的对象:

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() 的可接受返回值存储在 Session 中并检索它....检索后它仍然应该是一个游标... ..对吗???

这是什么解释???

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

最佳答案

在幕后,Session 是一个 ReactiveDict .如果你看看 source您会看到它通过 EJSON.stringify 序列化其数据。

如果您有简单的对象和原语,这会很有效,但是序列化一个类实例会剥离它的所有方法(函数没有序列化)。

这解释了为什么存储 fetch(文档数组)的结果有效,而存储 find(游标实例)的结果却无效。因为游标的方法已被删除,它不再像游标一样工作,空格键将无法遍历其文档。

关于javascript - meteor JS : Inconsistency with Meteor JS when dealing with cursors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850336/

相关文章:

javascript - 我怎样才能包装这个特定的函数?

javascript - 为什么 document.all.item 在本地主机上不起作用?

javascript - 黑鸟记录器 - 绝对没有任何反应

mysql - 我可以对 mongoDB 或 mySQL 使用 GraphQL 吗?

node.js - MongoDB 返回结果的关联数组

javascript - #each 完成后如何执行回调?

javascript - React-Router 疑问/问题

javascript - 在浏览器上使用 javascript 将 mp3 转换为 wav

javascript - 为每个元素运行一个函数

java - mongoDB 查询 Java 代码 [$和 lte 和 gte 的条件]