2016-02-04 33 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}}(即使它始终是一个项目)

相关问题