2014-12-14 6 views
3

У меня есть маршрутполучить параметры от маршрутизатора с Метеор и железа: маршрутизатор

Router.route('/post/:_id', { 
    name: 'post', 
    template: 'post' 
}); 

и помощник

Template.post.helpers({ 
    post: function() { 
    return Posts.findOne(this._id); 
    } 
}); 

Это обыкновение найти указанный пост. Но я думаю, что я ошибаюсь. Я видел некоторые проекты, в которых они использовали сеансы. Это действительно необходимо? Невозможно ли получить параметры с маршрутизатора?

ответ

3

Обычно вы бы установить контекст данных на уровне маршрута, как это:

Router.route("/post/:_id",{ 
    name:"post", 
    template:"post", 
    waitOn:function(){ 
    return this.subscribe("post",this.params._id); 
    }, 
    data:function(){ 
    return Posts.findOne(this.params._id); 
    } 
}); 

В RouteController методы, которые вы можете получить доступ к параметрам URL с помощью this.params.parameterName.

Затем в шаблоне сообщения вы можете получить доступ к контексту данных, установленному маршрутизатором, без необходимости использования специального помощника.

<template name="post"> 
    post id is {{_id}} 
</template> 

Что касается списка сообщений, то, вы можете придерживаться одной и той же схеме:

Router.route("/posts",{ 
    name:"posts", 
    template:"posts", 
    waitOn:function(){ 
    return this.subscribe("posts"); 
    }, 
    data:function(){ 
    return { 
     posts:Posts.find() 
    }; 
    } 
}); 

<template name="posts"> 
    {{#each posts}} 
    {{> postItem}} 
    {{/each}} 
</template> 
+0

Отлично! Как насчет моего списка сообщений? Должен ли он по-прежнему использоваться в качестве помощников? 'Template.posts.helpers ({posts: function() {return Posts.find();}});' – Jamgreen

+0

Отредактировано мое сообщение, чтобы рассказать об этом. – saimeunt

0

Это более организованно, чтобы все ваши данные выборку точек в помощниках. Таким образом, вы можете сделать это:

routes.js

Router.route('/post/:_id', { 
    name: 'post', 
    template: 'post' 
}); 

post.js

Template.post.helpers({ 
    post: function() { 
     var postId = Router.current().params._id; 
     return Posts.findOne({_id: postId}); 
    } 
}); 

Помните, что если вы не подписавшись (сообщения) в любой другой файл, вы можете подписаться на сам маршрутизатор:

routes.js (с подпиской)

Router.route('/post/:_id', { 
    name: 'post', 
    template: 'post', 
    waitOn: function() { 
     return Meteor.subscribe('posts'); 
    } 
}); 

Обновление:

Router.current().params._id кажется есть проблема, он будет возвращать все Id для этого маршрута ранее бежал.

Так перестроенный путь должен быть (пример из моего приложения):

route.js

Router.route('/play/:gameId', { 
    name: 'play', 
    template: 'gamesPlay', 
    waitOn: function() { 
     return Meteor.subscribe('games'); 
    }, 
    onBeforeAction: function() { 
     Session.set('gameId', this.params.gameId); 
     console.log('game id set '+Session.get('gameId')); 
     this.next(); 
    }, 
    onStop: function() { 
     // do something when user navigate away from this route 
    } 
}); 

games.js

Template.gamesPlay.helpers({ 
    game: function() { 
     var gameId = Session.get('gameId'); //instead of Router.current().params.gameId; 
     var game = Games.findOne({_id: gameId}); 
     return game; 
    } 
}); 
+0

Я думаю, что я согласен, что он более организован, но saimeunt говорит, что данные обычно устанавливаются в маршрутизаторе.Метеор упомянул какой-то предпочтительный способ сделать это? Я также буду иметь смысл иметь waitOn и выборку данных в одном месте в коде. – Jamgreen

+0

@ Jamgreen добавил waitOn пример. Я думаю, что подписки больше похожи на широкие точки данных, поэтому мы можем использовать их в маршрутизаторе и забывать. Но для конкретных переменных данных, которые мы используем в представлении, лучше всего использовать сами хелперы (проще других разработчиков найти, поскольку они сначала будут искать вспомогательный файл). –

+0

Что делать, если я хочу использовать 'postId' в нескольких функциях внутри помощников? Будет ли нормально указывать 'var postId = Router.current(). Params._id;' above 'Template.post.helpers ({'? – Jamgreen