此Meteor代码尝试将游标返回到字段data
引用的嵌入文档,然后在返回此模板帮助程序之前检查它是否存在(因为有些时候它不存在于ActiveTaskCol
中)方法。
稍后添加
预期返回的游标将在html {{#each data}}中用于更多工作,因此使用.find
代替.findOne
。
问题是即使data
中没有ActiveTaskCol
字段,if语句的计算结果为true,我也尝试了obj.count() > 0
,即使"数据& #34;字段不存在于集合中。
我怎样才能解决这个问题?谢谢
Template.index.helpers({
taskInputs: function () {
var ready = Meteor.subscribe('inputsCol').ready();
var data = InputsCol.find({});
var selectedTask = Session.get('taskSelected');
var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}});
if (typeof obj != 'undefined') { //<-always true --------------
return {items: obj};
} else {
return {items: data, ready: ready};
}
}
});
答案 0 :(得分:1)
总是如此,因为您正在使用find
,它返回一个游标。相反,您应该使用findOne
,这样,如果没有这样的文档,它将返回文档或未定义。我还建议您使用obj
来检查虚假值,例如undefined
,null
,false
而不是typeof obj != 'undefined'
Template.index.helpers({
taskInputs: function () {
var ready = Meteor.subscribe('inputsCol').ready();
var data = InputsCol.find({});
var selectedTask = Session.get('taskSelected');
var obj = ActiveTaskCol.findOne({action: selectedTask}, {field: {data: 1}});
if (obj) {
return {items: obj};
} else {
return {items: data, ready: ready};
}
}
});
<强>更新强>
根据您的评论,您可以使用obj.count()
检查是否有符合条件的文档。
Template.index.helpers({
taskInputs: function () {
var ready = Meteor.subscribe('inputsCol').ready();
var data = InputsCol.find({});
var selectedTask = Session.get('taskSelected');
var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}});
if (obj.count() > 0) {
return {items: obj};
} else {
return {items: data, ready: ready};
}
}
});
更新2
Template.index.helpers({
taskInputs: function () {
var ready = Meteor.subscribe('inputsCol').ready();
var data = InputsCol.find({});
var selectedTask = Session.get('taskSelected');
var obj = ActiveTaskCol.find({
action: selectedTask,
data: { $exists: true }
}, {
field: {data: 1}
});
if (obj.count() > 0) {
return {items: obj};
} else {
return {items: data, ready: ready};
}
}
});