Meteor JS:处理游标时与 Meteor JS 不一致?
Meteor JS: Inconsistency with Meteor JS when dealing with cursors?
我想我可能发现了 Meteor JS 中的一些不一致之处。
首先,这是一个完全可以接受的代码示例,它不会在 Meteor JS 的模板助手中引起错误:
Template.admin_menu_items.helpers({
menuItems: function(){
console.log('inside menuItems');
return MenuItems.find();
},
})
但是,如果我使用会话来存储 MenuItems.find()
的 returned 值
例如
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()
的可接受 return 值存储在会话中并检索它....检索后它应该仍然是游标.... .对吗???
这个怎么解释???
强调使用会话存储值不会更改检索时存储的对象....我尝试了上面相同的代码但只使用数组而不是游标...所以那是var snapshot = MenuItems.find().fetch();
而不是 var snapshot = MenuItems.find();
并且它不会产生任何错误......
在幕后,Session
是一个 ReactiveDict. If you have a look at the source,您会看到它通过 EJSON.stringify
.
序列化其数据
如果您有简单的对象和基元,这很有效,但是序列化一个 class 实例将去除它的所有方法(函数未序列化)。
这解释了为什么存储 fetch
(文档数组)的结果有效,而存储 find
(游标实例)的结果却无效。因为游标的方法已被删除,它不再像游标一样工作,空格键将无法遍历其文档。
我想我可能发现了 Meteor JS 中的一些不一致之处。 首先,这是一个完全可以接受的代码示例,它不会在 Meteor JS 的模板助手中引起错误:
Template.admin_menu_items.helpers({
menuItems: function(){
console.log('inside menuItems');
return MenuItems.find();
},
})
但是,如果我使用会话来存储 MenuItems.find()
的 returned 值
例如
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()
的可接受 return 值存储在会话中并检索它....检索后它应该仍然是游标.... .对吗???
这个怎么解释???
强调使用会话存储值不会更改检索时存储的对象....我尝试了上面相同的代码但只使用数组而不是游标...所以那是var snapshot = MenuItems.find().fetch();
而不是 var snapshot = MenuItems.find();
并且它不会产生任何错误......
在幕后,Session
是一个 ReactiveDict. If you have a look at the source,您会看到它通过 EJSON.stringify
.
如果您有简单的对象和基元,这很有效,但是序列化一个 class 实例将去除它的所有方法(函数未序列化)。
这解释了为什么存储 fetch
(文档数组)的结果有效,而存储 find
(游标实例)的结果却无效。因为游标的方法已被删除,它不再像游标一样工作,空格键将无法遍历其文档。