Meteor ironrouter - 即使我正在调用waitOn(),集合也会返回undefined

时间:2014-09-19 18:43:07

标签: meteor iron-router

更新:已解决此问题并修改代码以反映我添加的更改。我也强烈建议阅读这篇文章下面的评论。我们需要注意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)。

1 个答案:

答案 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,以便客户端和服务器都可以使用它。