更新:已解决此问题并修改代码以反映我添加的更改。我也强烈建议阅读这篇文章下面的评论。我们需要注意IronRouter的一些变化。
关键是要将以下内容添加到数据函数中:
if(!this.ready()) {
return;
}
我的应用程序中有IronRouter的问题。代码如下:
/**
* Project list view (all projects) with optional
* filter parameter for showing projects only by
* their category name.
*/
this.route('list', {
path: '/:_category_slug?',
template: 'template_main',
action: function() {
if(this.ready()) {
this.render();
}
},
waitOn: function() {
return [
Meteor.subscribe('projects'),
Meteor.subscribe('formations'),
Meteor.subscribe('categories')
];
},
data: function() {
if(!this.ready()) {
return;
}
if(this.params._category_slug) {
/**
* Building up the query given the category slug and the language
*/
var query = {};
query['slug.' + App.language] = this.params._category_slug;
/**
* Grab the category given the query
*/
var category = App.models.categories.findOne(query);
console.log(category);
return App.models.projects.find({}).fetch();
}
else {
return App.models.projects.find({}).fetch();
}
},
yieldTemplates: {
'components_header': {to: 'header'},
'views_list': {to: 'content'},
'components_footer': {to: 'footer'}
}
});
我要做的是从类别slug中获取类别,以便我可以访问其ID,这是我需要另一个查询。
问题是,当我重新加载页面并且上面给出的路径匹配时,这条路径似乎运行了三次,第一次在控制台上记录类别变量返回undefined,然后再返回两次,打印出实际类别。
我希望waitOn()函数在我到达数据函数时会填充所有类别,所以我可以在第一次使用查询访问我的类别数据,但这不会发生。
任何人都可以在我的代码中看到任何明显可能导致此问题的内容,为什么路由会运行三次?
我使用的是最新版本的IronRouter(iron:router@0.9.3)和Meteor(METEOR@0.9.2.2)。
答案 0 :(得分:2)
使用iron:router
< = 0.9.3时,您必须激活默认的loading
挂钩,以便在呈现模板之前获得WAITING的预期行为,以使订阅准备就绪。
在路由器配置代码中添加:
Router.onBeforeAction("loading");
这意味着您不再需要提供执行等待逻辑的action
函数(仅在WaitList
准备就绪时呈现模板。)
但是,当订阅尚未准备好时,data
函数仍将被初始调用,因此您必须自己进行检查:
data:function(){
if(!this.ready()){
return;
}
// return actual data when ready
}
有很多关于iron:router
关于这个loading
钩子行为的问题已经浮出水面,并且公平地认为它很吸引人,因为当你使用waitOn
时,你希望你的RouteController
在显示模板之前实际等待这些订阅,对吗?
这就是为什么在最新的"不稳定"发布iron:router@1.0.0-pre2
后,系统会在检测到您使用loading
后自动添加waitOn
个问题。
我强烈建议您切换到iron:router@1.0.0-pre2
以熟悉最新的API,它具有完整的重写功能和最新的文档。
https://github.com/iron-meteor/iron-router/blob/devel/Guide.md
它主要向后兼容一些陷阱,特别是它要求您在RouteController
文件夹中定义所有路由以及lib/
s,以便客户端和服务器都可以使用它。