2014-09-03 43 views
1

發生了什麼事情,當點擊.addGuest時,除了用餐變得未定義以及我的視圖被破壞之外,所有的工作都是有效的。 {{#if所有者}}顯示的所有內容都不會顯示,並且我的控制檯中出現此錯誤。流星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 

我的服務器控制檯上沒有錯誤,所有傳遞的數據都存儲在我的數據庫中。不知何故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

搜索'Session.set('current_meal'',你用它在那裏 – 2014-09-03 23:00:55

+0

你所看到的是一個基本的模板後,我的設置? Sessi關於什麼是帖子模板。 – 2014-09-03 23:17:14

+0

我已經閱讀過文檔,我需要更新對象時的回調。我不明白該怎麼做。 – 2014-09-03 23:25:05

回答

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返回到我的會話變量?解決方案是不讓會話返回null?這是有道理的,但爲我的事件處理程序添加驗證,僅僅是一種安全預防措施,還是必要的? – 2014-09-05 20:09:18

+0

'findOne'總是可以返回null。無論你多麼小心,無論你如何確信你正在查找的數據庫真的存在於數據庫中,你總是需要檢查'findOne'返回null的情況。這就是爲什麼我在分配Session變量之前檢查null,就像很好的做法一樣;並且依賴於'current_meal'的模板不會重新渲染。如果'current_meal'還沒有被第一次定義,你也*需要在你的處理程序中檢查null,即使使用了更早的檢查。 – 2014-09-05 20:19:35