我正在学习meteor编写一个简单的应用程序来从一个集合中提取信息(一组,并根据从该集合返回的内容(一个项目,名称和项目ID的大列表),在一个集合中查找项目名称的不同集合。我的想法是项目集合只在服务器上发布,因为它很大,客户端不需要直接访问它。
一切都或多或少有效,除了我认为我没有正确处理回调。这是我写的简单测试。我传递项目名称的模板:
Template.operations.getTypeID = function(name) {
result = "";
console.log("Precall Logging name: ", name);
console.log("Precall Logging result: ", result);
result = Meteor.call('getID', name, function (error, result) {
console.log("Async Logging in call: result: ", result);
});
console.log("Name is now", name);
console.log("Result is now", result);
return name;
}
这是服务器上的方法,我最终会根据名称查找ID:
Meteor.methods({
getID: function(itemName) {
result = itemName + "_changed";
console.log("server: getID result:", result);
return result;
}
});
这是我在HTML文件中调用模板的地方:
<td>{{getTypeID name}}</td>
当我使用应用程序时,我可以看到方法getID以异步方式调用 - getID方法中的结果发生更改,并在模板中的其他条目之后写入控制台。如何设置回调中返回的结果在模板中可用并返回到客户端,以便我可以在页面中呈现它?
更新:在进行一些修改后,这是我的console.log输出:
Precall Logging name: Apples lootlog.js:79
Precall Logging result: lootlog.js:80
Name is now Apples lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name: Oranges lootlog.js:79
Precall Logging result: lootlog.js:80
Name is now Oranges lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name: Melons lootlog.js:79
Precall Logging result: lootlog.js:80
Name is now Melons lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name: Grapes lootlog.js:79
Precall Logging result: lootlog.js:80
Name is now Grapes lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name: Onion lootlog.js:79
Precall Logging result: lootlog.js:80
Name is now Onion lootlog.js:86
Result is now undefined lootlog.js:87
Async Logging in call: result: Apples_changed lootlog.js:83
Async Logging in call: result: Oranges_changed lootlog.js:83
Async Logging in call: result: Melons_changed lootlog.js:83
Async Logging in call: result: Grapes_changed lootlog.js:83
Async Logging in call: result: Onion_changed
这是打印到流星控制台的内容:
server: getID Name: Apples
server: getID result: Apples_changed
server: getID Name: Oranges
server: getID result: Oranges_changed
server: getID Name: Melons
server: getID result: Melons_changed
server: getID Name: Grapes
server: getID result: Grapes_changed
server: getID Name: Onion
server: getID result: Onion_changed
答案 0 :(得分:0)
您是否尝试将变量分配给Meteor.call调用getID的返回值?看起来你想要变量'name'来改变,所以做'name = Meteor.call ...'应该照顾它。
答案 1 :(得分:0)
我不建议使用范例将数据传输到模板,因为每个项目都是循环的,你正在向服务器发送Meteor.call,这在更高延迟的环境中确实会降低速度。
模板帮助器里面有一个Meteor.call,它不能在客户端同步运行,所以你必须将结果传递给一个反应变量,例如Session
,然后将它们传递给模板
我建议您拨打一个电话而不是许多小电话,在下面的代码中,我使用了一个带有一系列名字的电话。
服务器
Meteor.methods({
//Input variable is an array of names
getID: function(itemNameArray) {
result = {}; //Initialize an empty array
itemNameArray.forEach(function(entry) {
itemNameArray[entry] = entry + "_changed";
});
return result;
}
});
客户端
Template.operations.getTypeID = function(name) {
Session.get("variables")[name];
}
Meteor.call('getID', ["Apples", "Oranges", "Grapes", "Onions"], function (error, result) {
Session.set("variables", result);
});
同样,我不确定你想要做什么,但你可以用你从哪里获得名字的数据源替换数组。
Session.set/get是reactive所以只要Meteor从服务器获取数据,它就会相应地更新模板