流星路由:如何扩展RouterController?

时间:2015-04-08 11:30:35

标签: meteor iron-router

我正在读这本书'发现流星'并有一个关于分页的问题(分页章节)。 我的router.js中有一个代码:

//router.js
...
PostsListController = RouteController.extend({
    template: 'postsList',
    increment: 4,
    postsLimit: function() {
        return parseInt(this.params.postsLimit) || this.increment;
    },
    findOptions: function() {
        return {sort: {submitted: -1}, limit: this.postsLimit()};
    },
    subscriptions: function() {
        this.postsSub = Meteor.subscribe('posts', this.findOptions());
    },
    posts: function() {
        return Posts.find({}, this.findOptions());
    },
    data: function() {
        var hasMore = this.posts().count() === this.postsLimit();
        var nextPath = this.route.path({postsLimit: this.postsLimit() + this.increment});
        return {
            posts: this.posts(),
            ready: this.postsSub.ready,
            nextPath: hasMore ? nextPath : null
        };
    }
});
...
Router.route('/:postsLimit?', {
    name: 'postsList'
});

这很好用。我的问题描述:

我有另一条路线(' / news')并且也想为这条路线做分页。我应该如何正确扩展PostsListController来实现它?

我的每个帖子都有一个标记选项,在这种情况下它是一个新闻',所以我想只看到有'新闻'标签。 我试着复制粘贴这个控制器(PostsListController)和:

renamed it;
set another template;
changed:

posts: function() {
            return Posts.find({}, this.findOptions());
        }

为:

posts: function() {
            return Posts.find({postType: 'news'}, this.findOptions());
        }

它不起作用,在我/页面新闻中我只能看到我的所有新闻文章和微调器。我补充道:

Router.route('/news/:postsLimit?', {
    name: 'newsTemplate',
    controller: NewsTemplateController
});

但是,当我访问/ news / 1时,我会看到我的所有帖子(不仅仅是一个),而按钮“显示更多”'。 我认为这种复制粘贴方法非常糟糕,但我没有想法如何使其正常工作。

1 个答案:

答案 0 :(得分:0)

你的第一个问题/ news显示所有帖子是因为你的第一个Route规范过于通用了。

Router.route('/:postsLimit?', {
    name: 'postsList'
});

此路线规范会将带有一个参数的所有请求发送到PostsListController

即。所有这些路径都将路由到PostsListsController:

/ ASDF
/测试
/消息

要解决此问题,您可能希望使第一条路线更具体:

Router.route('/posts/:postsLimit?', {
    name: 'postsList'
});

我不知道为什么你在去/ news / 1时会得到多个项目 你能发布那个控制器的代码吗?