2015-04-24 3 views
3

Я думаю, что, возможно, я нашел некоторое несоответствие в Meteor JS. Во-первых, это является примером совершенно приемлемый код, который не вызывает ошибку в шаблоне Helper Метеор JS'S:Meteor JS: Несогласованность с Meteor JS при работе с курсорами?

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

Однако если использовать сессии для хранения возвращаемого значения MenuItems.find() например,

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

Затем используйте объект, хранящийся в Sessions в шаблоне Helper:

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 

Который не имеет смысла, потому что я храню приемлемое возвращаемое значение MenuItems.find() внутри сеанса и извлечение его .... он все равно должен быть курсором после извлечения ..... прав ???

Какое объяснение для этого ???

Чтобы подчеркнуть, что использование сеансов для хранения значения не изменяет объект, сохраненный при извлечении .... Я пробовал тот же код, но только с массивом вместо курсора ... так что это var snapshot = MenuItems.find().fetch(); вместо var snapshot = MenuItems.find(); и с этим он не производит никаких ошибок .......

ответ

4

Под капотом Session является ReactiveDict. Если вы посмотрите на source, вы увидите, что он сериализует свои данные через EJSON.stringify.

Это хорошо работает, если у вас есть простые объекты и примитивы, однако сериализация экземпляра класса разделит все его методы (функции не сериализуются).

Это объясняет, почему сохранение результата fetch (массива документов) работает, тогда как сохранение результата find (экземпляр курсора) не выполняется. Поскольку методы курсора были удалены, он больше не ведет себя как курсор, а пробелы не смогут перебирать свои документы.