如何使用 iron-router 使用一个路由控制器渲染多个模板?

How do you render multiple templates with one route controller using iron-router?


背景:

我正在使用 meteor 和 iron-router 创建博客。我想为几个不同的“类别页面”使用一个控制器,这些页面过滤收益区域中的博客文章列表。

问题:

URL 更改时,文章列表不会重新呈现。 IE。文章列表不是被动的。有趣的是,如果我导航回主页,就会显示正确的文章列表。

问题:

当我在类别路由控制器上的不同路由之间切换时,如何使文章列表发生变化?


一些示例代码:

请注意,整个项目的代码都可用 here

这是我的路由控制器:

CategoryController = RouteController.extend({
    action: function(){
        this.render();
    },
    template: 'category',
    data: function(){
        return {category: this.params.category};
    }
});

CategoryController.helpers({
    articles: function(){
        return Articles.find({category: this.params.category});
    }
});

这是它正在渲染的模板:

<template name='category'>
    <div class="container">
        <h2>{{category}}:</h2>
        <ul>
            {{#each articles}}
                <li>
                {{#linkTo route="article.show"}}
                    {{title}}
                {{/linkTo}} 
                </li>
            {{/each}}
        </ul>
    </div>
</template>

Resources/Updates:

文章列表没有改变,因为模板助手没有使用反应式数据源。您可以使用 RouteController.getParams 方法建立对路由参数的反应依赖,如下所示。

CategoryController.helpers({
    articles: function(){
        var controller = this;
        var params = controller.getParams();

        return Articles.find({category: params.category});
    }
});

来自Iron Router documentation

Note: If you want to rerun a function when the hash changes you can do this:

// get a handle for the controller.
// in a template helper this would be
// var controller = Iron.controller();
var controller = this;

// reactive getParams method which will invalidate the comp if any part of the params change
// including the hash.
var params = controller.getParams();

By default the router will follow normal browser behavior. If you click a link with a hash frag it will scroll to an element with that id. If you want to use controller.getParams() you can put that in either your own autorun if you want to do something procedural, or in a helper.