Метеорно ​​маршрутизиране: как да разширя RouterController?

Чета книгата „Открийте метеора“ и имам въпрос относно пагинирането (глава за пагиниране). Имам код в моя 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());
        }

to:

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

Не работи, на моята /страница новини мога да видя само всички мои новинарски статии и спинера. Добавен съм:

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

Но когато отида на /news/1, виждам всичките си публикации (не само една) и бутона „покажи още“. Мисля, че този подход за копиране и поставяне е толкова лош, но нямам идеи как да го накарам да работи правилно.


person bartezr    schedule 08.04.2015    source източник


Отговори (1)


Първият ви проблем, при който /news показва всички публикации, е защото първата ви спецификация на маршрута е твърде обща.

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

Тази спецификация на маршрута ще изпрати всички заявки с един параметър до PostsListController

т.е. всички тези пътища ще насочат към PostsListsController:

/asdf
/тест
/новини

За да коригирате това, може да искате да направите първия маршрут по-конкретен:

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

Не съм сигурен защо получавате повече от един елемент, когато отивате на /news/1.
Можете ли да публикувате кода си за този контролер?

person phunktrain    schedule 08.04.2015