正在发生的事情是,当点击.addGuest时,一切都有效,除了用餐变得不确定,我的观点被打破了。 {{#if owner}}显示的所有内容都不会显示,我在控制台中收到此错误。
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
我的服务器控制台上没有错误,所有传递的数据都存储在我的数据库中。不知怎的,Session.get('current_meal')正在丢失它在invite方法上的数据。我从事件处理程序中评论了它,其他一切都很完美。
由于
这是我的查询迷失了......
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 :(得分: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) {