我在Meteor中的模板助手中有一个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 };
}
答案 0 :(得分:1)
Collection.findOne
在运行代码之后完成(在您的情况下为var curAccess = _.without(curObj.access, Meteor.userId());
)。
问题是,您希望通过此查询获得的文档尚未提供给客户端,因此Matters.findOne({_id:Session.get('editing_matter')});
会返回undefined
。
那么,当第一次运行帮助程序并且失败时,它的实际意味着您的订阅尚未就绪。
您可以做的是在访问其属性之前检查curObj
是否不是undefined
(例如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 };
}
答案 1 :(得分: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}}
(即使它始终是一个项目)