无法从 Flow Router (Meteor) 上的 url 读取 slug

Can not read the slug from url on Flow Router (Meteor)

我正在尝试使用 Flow Router 实现基本路线。但无论我请求的 collection 文件的 _id 是什么;我总是只在 collection - 'Requests'.

中获取有关第一个文档的信息

所以这是我在文件 /lib/routes.js 中的路由定义:

FlowRouter.route('/requests/:reqId', {  
  subscriptions: function (params, queryParams) {
    this.register('theRequest', Meteor.subscribe('singleRequest', params.reqId));
  },
  action: function (params, queryParams) {
    FlowLayout.render('layout', { aside: 'aside', main: 'singleRequest' });
    console.log("Yeah! We are on the post:", params.reqId);
  },
  name: 'aRequest'
});

这是我的帮手:

Template.singleRequest.helpers({  
    getRequest: function () {
        return Requests.findOne();
    }
});

这是我的服务器发布:

Meteor.publish('singleRequest', function (reqId) {  
    return Requests.find({ _id: reqId});
});

这是模板:

<template name="singleRequest">  
  {{#if isSubReady 'theRequest'}}
    {{#with getRequest}}
      <h2>{{_id}}</h2>
      <p>{{reqFrom}}</p>
      <p>{{reqBy}}</p>
    {{/with}}
  {{else}}
    loading...
  {{/if}}
</template> 

我做错了什么? 注意:在控制台中,由于路由定义中的 console.log 命令,我确实看到了正确的 'reqId' slug。但是我没有看到它所属文档的相关信息。

谢谢!

我相信您的代码对于您要执行的操作是正确的。但是,我从您直接复制 flow-router 的代码推断出您对 Meteor 很陌生。因此,我愿意赌你的应用程序中仍然有 autopublish 包。

Autopublish 将您集合中的所有数据推送到客户端。即使没有 publish/subscribe 电话。

你可以做两件事。要保持自动发布(这将使您的开发过程在开始时更容易,但以后可能会更难),只需将您的模板助手更改为:

Template.singleRequest.helpers({  
    getRequest: function () {
        return Requests.findOne({ _id: FlowRouter.getParam("reqId")});
    }
});

或者(您最终会想要这样做),进入命令行并输入:

meteor remove autopublish

您可以在很多地方阅读有关自动发布的优缺点,以自行决定最适合您的选项。但是,您还应该考虑将来是否要缓存数据(例如使用 subsManager),因此无论如何您都可能想要更改模板助手。

好的,我的问题是我之前有另一个订阅,我在其中发布了所有请求 - 而不仅仅是具有特定 _id 的请求。而且因为我没有创建助手来只获得具有特定 _id 的助手;当然,服务器只是向我发送了第一个请求。

我的解决方案是只订阅以前的订阅并在帮助程序中定义以获取请求 _id:

FlowRouter.route('/requests/:reqId', {  
  subscriptions: function (params, queryParams) {
    this.register('allRequests', Meteor.subscribe('Requests', params.reqId));
  },
  action: function (params, queryParams) {
    FlowLayout.render('layout', { aside: 'aside', main: 'singleRequest' });
    console.log("Yeah! We are on the post:", params.reqId);
  },
  name: 'aRequest'
});

和助手:

Template.singleRequest.helpers({ 
  getRequest: function () {
    var reqId = FlowRouter.getParam("reqId")
    return Requests.findOne({_id:reqId});
  }    
});

对于浏览此问题并寻找如何让 Flow Router 捕获并动态地link 到来自 db 的 slugs ,然后调用模板页面的任何人每个项目,我制作了一个非常简单的示例应用程序并将其发布在 here on GitHub.

希望对大家有所帮助。