如何通过自动发布等待订阅Iron Router?

时间:2016-02-15 16:21:32

标签: javascript meteor iron-router

我实际上正在使用Meteor开发WebApp。因为我更专注于UI和规范,而不是为生产做好准备并考虑安全问题。(在我做完好的PoC之后,我会这样做。)

我想保留自动发布和不安全的软件包(该死的很快就可以了)。

我遇到了Iron Router的烦人问题。 问题很简单,但我找不到让它正常工作的方法。有时数据随机返回未定义。

Router.route('/stuff/:_id', {
  name: 'stuff',
  template: 'stuff',

  data: function(){
    var stuff = Stuffs.findOne(this.params._id);
    console.log("stuff: ", stuff);
    return {headerTitle: stuff.name, stuffData: stuff};
  },
  action: function(){
    this.render();
  }
});

实际上并不是随机的,我猜这样的事情会发生:

当我从App的链接点击此路线时工作正常(我猜数据准备好了)

但是在页面刷新或者通过url导航时,我可能会有这个恼人的未定义。

所有内容都是自动发布的,所以在我的路线中使用waitOn会很奇怪......

是否有人遇到同样的问题并获得解决方案?

2 个答案:

答案 0 :(得分:1)

  

当我从App的链接点击此路线时工作正常(我猜数据准备好了)

客户端已经存在数据。在这种情况下,Iron Router仅进行客户端路由(即,没有呼叫进入服务器)。

  

但是在页面刷新或者通过url导航时,我可能会有这个烦人的未定义。

在这种情况下,您实际上是从服务器端请求数据..通过HTTP GET请求,您可能没有定义任何路由。

修改

关于HTTP GET请求我错了。似乎无论我们从浏览器加载哪个链接,Meteor服务器都会发送整个构建。将整个构建加载到客户端后,Iron Router根据URL路径决定加载哪个模板。

在页面加载/刷新时,页面在从服务器端接收数据之前呈现。这是获得undefined的最可能原因。

在客户端数据库上附加此侦听器以检查服务器何时更新它:

if (Meteor.isClient) {
  Stuffs.find().observe({
    added: function(doc) {
        console.log("Updated Stuffs : ", JSON.stringify(doc));
    }
  });
}

答案 1 :(得分:1)

搞定! 比我想象的要简单!

相关问题: https://github.com/iron-meteor/iron-router/issues/295

显然Meteor游标是被动的,最后我只需做:

Router.route('/stuff/:_id', {
  name: 'stuff',
  template: 'stuff',

  data: function(){
    var stuff = Stuffs.findOne(this.params._id);
    if(stuff){
        console.log("stuff: ", stuff);
        return {headerTitle: stuff.name, stuffData: stuff};
    }
  },
  action: function(){
    this.render();
  }
});

在做任何事情之前测试是否未定义东西,因此不使用东西 - >没有错误。在更新时,钩子将重新运行,完成。

那就是它。很酷很简单,我甚至都没想过!