2016-02-04 2 views
0

У меня есть findOne() в помощнике шаблона в Метеор, но я хочу изменить массив в документе, прежде чем возвращать как документ, так и обновленный массив. При этом я получаю TypeError: Cannot read property 'access' of undefined. При первоначальном тестировании он работал нормально, но я подозреваю, что он теперь терпит неудачу, потому что я пытаюсь изменить документ до завершения findOne(). Как мне обойти это? Код ниже:Метеор задержки найти(), чтобы я мог получить доступ к объекту

'curMatter': function() { 
var curObj = Matters.findOne({_id:Session.get('editing_matter')}); 
var curAccess = _.without(curObj.access, Meteor.userId()); 
return { curMatter: curMatter, curAccess: curAccess }; 
} 

ответ

1

Collection.findOne завершается перед запуском кода кода, который после того, как он (var curAccess = _.without(curObj.access, Meteor.userId()); в вашем случае).

Проблема в том, что документ, который вы ожидаете получить по этому запросу, пока недоступен клиенту, поэтому Matters.findOne({_id:Session.get('editing_matter')}); возвращает undefined.

Так что это означает, что ваша подписка не готова, когда помощник запускается в первый раз, и он терпит неудачу.

Что вы можете сделать, это проверить, является ли curObj не undefined перед обращением к своей собственности (т.е. var curAccess = curObj && _.without(curObj.access, Meteor.userId());

Когда документ становится доступным для клиента, помощник будет повторно запустить, и вы получите правильные результаты . затем

Вот ваш полный код:

'curMatter': function() { 
    var curObj = Matters.findOne({_id:Session.get('editing_matter')}); 
    var curAccess = curObj && _.without(curObj.access, Meteor.userId()); 
    return { curMatter: curMatter, curAccess: curAccess }; 
} 
0

просто использовать его как курсор, они всегда, кажется, лучше работать в любом случае

.
Template['someTemplate'].helpers({ 
    curMatter: function() { 
    return Matters.find({ 
     _id: Session.get('editing_matter') 
    }).map(doc => Object.assign(doc, { 
     curAccess: _.without(doc.access, Meteor.userId()) 
    })) 
    } 
}); 

Затем вы можете использовать {{#each}} в шаблоне (даже если это всегда один пункт)

Смежные вопросы