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

时间:2015-01-31 21:00:46

标签: javascript mongodb meteor iron-router


背景

我正在使用流星和铁路由器制作博客。我想为几个不同的“类别页面”使用单个控制器,它会在yield区域中过滤博客文章列表。

问题:

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

问题:

当我在类别路径控制器上的不同路线之间切换时,如何更改文章列表?


一些示例代码:

请注意,整个项目的代码可用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>

资源/更新:

1 个答案:

答案 0 :(得分:1)

文章列表不会更改,因为模板助手未使用被动数据源。您可以使用RouteController.getParams方法建立对路由参数的响应依赖关系,如下所示。

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

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

来自Iron Router documentation

  

注意:如果要在哈希更改时重新运行函数,则可以执行此操作   这样:

// 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();
     

默认情况下,路由器将遵循正常的浏览器行为。如果你   单击带有散列碎片的链接,它将滚动到具有该散列的元素   ID。如果你想使用controller.getParams()你可以把它放进去   要么你自己的自动运行,如果你想做一些程序性的,或在   帮助者。