无法从 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.
希望对大家有所帮助。
我正在尝试使用 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.
希望对大家有所帮助。