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

How to wait for subscribtion Iron Router with auto-publish?

我实际上正在使用 Meteor 开发 WebApp。因为我更关注 UI 和规范,而不是准备生产和查看安全问题。(我会在完成良好的 PoC 之后再做)。

我想保留 autopublish 和 insecure 包(该死的快点太酷了)。

我在使用 Iron Router 时遇到了一个恼人的问题。 问题很简单,但我找不到使它正常工作的方法。有时数据 return 随机未定义。

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();
  }
});

其实也不是随机的,我猜是这样的:

当我从应用程序 link 开始这条路线时工作正常(我想数据已经准备好了)

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

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

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

Working well when I hit this route from link from the App (I guess the data is ready)

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

But on page refresh, or on naviguate by the url, I could have this annoying undefined.

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

编辑

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


似乎在页面 load/refresh 上,页面在从服务器端接收数据之前呈现。这是获得 undefined.

的最可能原因

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

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

明白了! 比我想象的要简单!

与此问题相关: 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();
  }
});

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

就是这样。非常酷和简单,我什至没有想到!