2015-04-24 117 views
3

我想我可能在流星JS中发现了一些不一致。 首先这是不流星JS的模板助手内引起误差的完全可接受的代码的示例:如果我使用会话来存储的MenuItems.find() 例如返回值流星JS:在处理游标时与流星JS不一致?

Template.admin_menu_items.helpers({ 
    menuItems: function(){ 
    console.log('inside menuItems'); 
    return 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'); 
     }, 
}) 

我收到以下错误:

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

[email protected]://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:179:1 
ObserveSequence.observe/computation</<@http://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:144:1 
[email protected]://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:593:12 
ObserveSequence.observe/computation<@http://localhost:3000/packages/observe-sequence.js?0532a9dd76dd78f543eb4d79a1e429df186d8bde:121:7 
[email protected]://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:327:5 
[email protected]://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:346:9 
[email protected]://localhost:3000/packages/tracker.js?6d0890939291d9780f7e2607ee3af3e7f98a3d9c:485:9 
[email protected]://localhost:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:372:11 

,因为我存储不使SENSE在Session内部可接受的返回值MenuItems.find()并检索它....它应该仍然是检索后的光标.....正确???

这是什么解释?

要强调使用会话来存储值不会更改检索时存储的对象....我试着上面的代码相同,但只有一个数组而不是一个游标...所以这是var snapshot = MenuItems.find().fetch();而不是var snapshot = MenuItems.find();并与此不会产生任何错误.......

回答

4

在引擎盖下,Session是一个ReactiveDict。如果你看看source,你会看到它通过EJSON.stringify将其数据序列化。

如果你有简单的对象和原语,但是序列化一个类实例会去掉它的所有方法(函数没有被序列化),这很好。

这解释了为什么存储fetch(文档数组)的结果起作用,而存储find(游标实例)的结果却没有。由于游标的方法已被删除,它不再像游标那样运行,空格键将无法迭代其文档。