流星:铁路由器=> waitOn没有订阅

时间:2015-04-28 15:21:12

标签: meteor loading iron-router

我希望在网站包含要呈现的所有数据之前显示加载模板。

在服务器端方法通过Meteor.call向我提供数据(来自API [async])后,我想加载正确的布局。

我尝试了很多在Google上找到的方法,这些方法描述了相似但不完全相同的问题。包括定义具有就绪句柄的函数的方式,也不起作用。我无法让它运行。

我不想使用集合,因为这是用户特定的数据。(我认为为每个用户[没有登录用户]制作集合效率不高,或者我错过了什么)这可能吗?< / p>

这是我的代码。控制台记录2个1。

Router.route('/search/:term',{
    name: 'search',
    loadingTemplate: 'loading',
    waitOn : function(){
        var term = this.params.term;
        //i think here has be something differnet either with return subscribe or function with ready-handle
        Meteor.call('search',term,function(err, response) {
            Session.set('shops', response);
            console.log(1);
        });
    },
    action : function(){
        console.log(2);
        this.render();
    }
});

Template.search.helpers(
    {
        "shops" : function(){
            return Session.get('shops');
        }
    }
);

服务器端方法返回一个数组。

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

铁路由器的waitOn不会等待Meteor.call()。相反,设置此方法的方法是subscribewaitOn中的记录集,publish包含Meteor.call()的函数,然后创建客户端为每个用户收集集合以接收呼叫结果。它看起来如下所示:

客户端:

// create this collection only on the client
// to receive publication on a per-user basis

Search = new Mongo.Collection('search');

路线:

Router.route('/search/:term',{
  waitOn : function(){
    var term = this.params.term;
    return Meteor.subscribe('search', term);
  }
});

服务器:

Meteor.publish('search', function(term){
  check(term, String);
  var self = this;
  Meteor.call('search', term, function(error, result){
    if (result){
      self.added("search", "mySearch", {results: result});
      self.ready();
    } else {
      self.ready();
    }
  });
});

Meteor.methods({
  search: function(term){
    //do the api call and return it
  }
});

我建议您查看Meteor documentation here中低级添加/更改/删除发布功能的示例。它是一个密集的部分,但最终包含了使用例工作所需的内容。