2016-02-04 106 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

那麼它真的意味着你的訂閱還沒有準備好,當幫助器第一次運行,它就會失敗。

你可以做的是檢查是否curObjundefined訪問其屬性(即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}}(即使它始終是一個項目)

相關問題