2014-09-03 2 views
1

Что происходит, когда нажата кнопка .addGuest, все работает, за исключением того, что еда становится неопределенной и мое представление нарушено. Все, что обнаружено {{#if owner}}, не отображается, и я получаю эту ошибку в своей консоли.Meteor collection.update вызывает сброс переменной сеанса

Exception in template helper: TypeError: Cannot read property 'owner' of undefined 
at Object.Template.menu_details.helpers.owner  (http://localhost:3000/client/workflow/meal_details_page/meal_details.js 

У меня нет ошибок на моей консоли сервера, и все передаваемые данные сохраняются в моем db. Как-то Session.get ('current_meal') теряет данные о методе приглашения. Я прокомментировал это из обработчика событий, и все остальное работает отлично.

Благодаря

это мой запрос, который заблудился ...

meal: function() { 
return MealModel.findOne(Session.get('current_meal')); 
}, 
owner: function() { 
var meal = MealModel.findOne(Session.get('current_meal')); 
return meal.owner === Meteor.userId(); 
}, 

Вот мой метод на сервере

 invite: function (options) { 
    check(options, { 
     mealId: String, 
     firstName: String, 
     lastName: String, 
     email: String 
    }); 
    var meal = MealModel.findOne(options.mealId); 
    if (! meal || meal.owner !== this.userId) 
     throw new Meteor.Error(404, "No such meal"); 
    MealModel.update(options.mealId, {$addToSet: { 
     invited: { 
     firstName: options.firstName, 
     lastName: options.lastName, 
     email: options.email 
     }}}); 
    }, 

моя Meteor.call функция ...

invite = function(options) { 
Meteor.call('invite', options); 
    }, 

и, наконец, мой обработчик события ...

'click .addGuest': function (evt, tmpl) { 
var firstName = tmpl.find('.firstName').value; 
var lastName = tmpl.find('.lastName').value; 
var email = tmpl.find('.email').value; 
var meal = Session.get('current_meal'); 

if (firstName.length && lastName.length && email.length) { 
    var id = createGuest({ 
    firstName: firstName, 
    lastName: lastName, 
    email: email, 
    meal: meal._id, 
    owner: meal.owner 
    }); 
invite({ 
    firstName: firstName, 
    lastName: lastName, 
    email: email, 
    mealId: meal._id 
    }); 
}; 
return false; 
}, 
+0

Искать 'Session.set ('current_meal'', где вы используете его –

+0

Что вы ищете в основном пост шаблон я устанавливаю?. Сесси о том, что будет шаблоном сообщений. –

+0

Я прочитал в документах, что мне требуется обратный вызов при обновлении объекта. Я не понимаю, как это сделать. –

ответ

2

код, который отсутствует из вашего вопроса, где вы установить сеанс переменной current_meal. Вы должны быть осторожны с findOne, потому что он возвращает null, когда документов не найдено, и это может произойти, когда в коллекции действительно нет соответствующих документов, но также если вы находитесь на клиенте, а соответствующие документы просто не имеют синхронизированный с клиентом.

Чтобы исправить это, найти код, который говорит Session.set('current_meal', meal) или подобное, и добавить проверку таким образом, что это происходит только когда meal не равно нулю:

if (meal != null) 
    Session.set('current_meal', meal); 

Кроме того, в обработчике события click .addGuest, убедитесь, что meal действует, как вы также проверить другие значения:

if (firstName.length && lastName.length && email.length && meal != null) { 
+0

Хорошо. Поэтому позвольте мне убедиться, что я это понимаю. Когда я обновляю свой объект, он возвращает null для моей переменной сеанса? И решение состоит в том, чтобы не позволить Session возвращать null? Это имеет смысл, но добавление проверки для моего обработчика событий - это просто меры предосторожности или же это необходимо? –

+0

'findOne' всегда может возвращать null. Независимо от того, насколько вы осторожны, независимо от того, насколько вы уверены в том, что именно вы ищете в базе данных, вам всегда нужно проверить, когда 'findOne' возвращает null. Вот почему я проверяю значение null, прежде чем назначать переменную Session, как хорошую практику; и поэтому шаблоны, зависящие от 'current_meal', не перезаписываются. Вы также * должны проверить нуль в вашем обработчике, даже с более ранней проверкой, в случае, если 'current_meal' еще не определен в первый раз. –

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