0

我正在学习流星编写一个简单的应用程序来从一个集合中提取信息(一组,并基于从该集合返回的内容(项目、名称和项目 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
4

2 回答 2

0

您是否尝试过为您的 Meteor.call 调用 getID 的返回值分配一个变量?看起来您希望变量 'name' 改变,所以执行 'name = Meteor.call ...' 应该处理它。

于 2013-02-08T22:10:53.267 回答
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响应式的,因此一旦 Meteor 从服务器获取数据,它就会相应地更新模板

于 2013-02-08T23:57:48.097 回答