在流星助手中发出ajax请求

时间:2013-04-17 22:59:46

标签: javascript ajax meteor

在将数据返回到meteor helpers方法时,我怎么能等到ajax请求完成。

例如,

Template.item.helpers({

        itemName:function () {
            var user = Meteor.user();

            $.when(reallyLongAjaxRequest()).done(function (a1) {
               //tried using jquery when
                return "Item Name should have this because it waited";
            });

            return " Doesnt wait at all";
        }
    });

我有一个reallyLongAjaxRequest()正在运行,我希望它能继续使用我的itemName帮助程序。控制台的日志语句始终显示未定义,但这是因为ajax请求尚未完成。我没有运气时尝试使用jquery。任何想法

编辑:

我应该提一下,我在辅助功能中是有原因的。我需要呈现项目'id',以便我可以使用该参数运行ajax请求。使用被动会话是完美的,但我不知道如何在Helpers方法定义之外获取当前渲染项目?

3 个答案:

答案 0 :(得分:5)

未命名的集合是为名称传递null的集合。它是内存中的数据结构,不保存到数据库中。 (http://docs.meteor.com/#meteor_collection

好的,给定一个名为“items”的Meteor集合,并希望根据项目_id对每个项目执行ajax请求,然后能够在模板中引用ajax结果,这就是我要做的:

(粗略地)

var Items = new Meteor.Collection('items');
var Results = new Meteor.Collection(null);

Items.find().observeChanges({
  added: function (id) {
    $.get(url, {id: id}, function (data) {
      if (Results.findOne(id))
        Results.update(id, {$set: {result: data}});
      else
        Results.insert({_id: id, result: data});
    });
  }
});

Template.item.itemName = function (id) {
  var doc = Results.findOne(id);
  if (doc)
    return doc.result;
  else
    return "";
};
在你的html中,你需要将id传递给帮助者:

{{itemName _id}}

在定义帮助程序时,没有办法只是暂停几秒钟,以便我的ajax请求完成而不立即返回。

不,反应式编程会立即发生,但是当你有新东西时会更新。

答案 1 :(得分:1)

单独制作ajax请求,完成后,将结果存储在Session变量中。然后让模板助手返回Session变量的值。大致...

$.get(url, function (data) {
  Session.set('result', data);
});

Template.item.itemName = function () {
  return Session.get('result');
};

Session是一个被动数据源,因此当ajax调用的结果进入时,你的模板会自动更新。(当然你可以选择调用Session变量,我只是以“结果”为例)

答案 2 :(得分:-1)

这在MeteorJS中工作和测试> 1.3.x中

从控制台-d

添加http包

将数据元素发送到服务器并使用自定义标头的POST调用示例。

meteor add http