2015-04-24 171 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(遊標實例)的結果卻沒有。由於遊標的方法已被刪除,它不再像遊標那樣運行,空格鍵將無法迭代其文檔。