【发布时间】:2013-07-23 07:53:37
【问题描述】:
我从一个集合返回结果,第二个结果依赖于第一个。所以,我找到了 resultA,而 resultB 必须是不等于结果 A 的任何东西。
我的 console.log 语句显示了我想要的数据,但是,当我返回它时,我的车把模板中没有显示任何内容。即使我 JSON.stringify 它也没有任何返回。
myCollection.find({}, {limit:1, skip: _.random(minimum, maximum)}).forEach(function(a){
myCollection.find({'': {$ne: a._id}}, {limit:1}).forEach(function(b){
console.log({resultA: a, resultB: b})
return {resultA: a, resultB: b};
});
});
我在这里做错了什么?
现在我尝试使用 deps.autorun 以防集合尚未准备好(这是因为 console.log 始终有效)
Template.votes.helpers({
twoItems: function(){
var minimum = 0;
Deps.autorun(function(){
var maximum = (Items.find().fetch().length) - 1;
if (maximum){
var itemA = Items.find({}, {limit:1, skip: _.random(minimum, maximum)}).fetch()[0];
}
if(itemA){
console.log(itemA);
var itemB = Items.find({'': {$ne: itemA._id}}, {limit:1}).fetch()[0];
}
if (itemB) {
data = {itemA:itemA, itemB:itemB};
console.log(data);
return data;
}
});
},});
使用简单的模板:
<template name="votes">
<p>Test</p>
<hr>
{{twoItems}}
<hr></template>
至少它应该返回 Object 但什么也没有。 Console.log 总是返回正确的数据,但渲染的车把模板中没有显示任何内容。
编辑:我最终不得不使用以下内容:
twoItems: function(){
var minimum = 0;
var maximum = (Items.find().fetch().length) - 1;
var itemA = Items.find({}, {limit:1, skip: _.random(minimum, maximum)}).forEach(function(a){
Session.set('itemAid', a._id);
});
var itemA = Items.find({'_id': Session.get('itemAid')}).fetch()[0];
var itemB = Items.find({'_id': {$ne: Session.get('itemAid')}}, {limit:1,skip: _.random(minimum, maximum - 1)}).fetch()[0];
return {itemA: itemA, itemB: itemB};
},
我仍然不知道为什么回调不能返回任何东西。在文档中它说
如果您将回调函数作为最后一个参数 [In a Meteor.Call](它不能作为方法的参数,因为函数不可序列化),则该方法将异步运行:它不会返回任何内容特别是不会抛出异常。
所以我假设由于收集操作也是一个流星调用,所以这就是返回被忽略的原因。
【问题讨论】:
-
贴出车把的代码
-
对,这个错误最有可能在Handlebars中。
-
感谢您的回复。我的车把里只有 {{twoItems}}。我也试过 {{#each twoItems}}{{this}}{{/each}}。然而,奇怪的是,如果我将 return 语句 outside forEach(或 map)回调,那么它会返回并显示示例数据。但是 find 回调中的任何内容都不会返回。但我知道回调中的代码会被执行,因为我所有的 console.log() 语句都会在 foreach 和/或 map 回调中执行。
-
hm...是不是因为返回的地方不是车把?
-
您在 Meteor.call() 中包含的报价无关紧要。 Meteor.call() 是一个调用流星方法的函数。您没有使用 Meteor.call() 或任何流星方法。
标签: javascript meteor