Настройка Meteor Flow Router example.com/singlePostPage

У меня не получается создать маршруты для показа одного поста с Flowrouter и blaze в Meteor.

Это то, что у меня есть до сих пор, и я уверен, что это в основном неправильно!

publications.js

Meteor.publish('singlePost', function (postId) {
  return Posts.find({ _id: postId });
});

Router.js

FlowRouter.route("/posts/:_id", {
    name: "postPage",
    subscriptions: function (params, queryParams) {
     this.register('postPage', Meteor.subscribe('singlePost'));
 },
    action: function(params, queryParams) {
        BlazeLayout.render("nav", {yield: "postPage"} )
    }
});

singlePost.JS

Template.postPage.helpers({
  thisPost: function(){
    return Posts.findOne();
  }
});

singlePost.html

<template name="postPage">
  {{#with thisPost}}
    <li>{{title}}</li>
  {{/with}}
</template>

Раньше я делал это с маршрутизатором Iron, но теперь запутался с маршрутизатором Flow.


person AHH    schedule 04.01.2016    source источник


Ответы (1)


Во-первых, не используйте подписки FlowRouter. Это скоро будет устаревшим. Используйте Meteor PubSub. Сначала в route.js:

    // http://app.com/posts/:_id
    FlowRouter.route('/posts/:id', {
        name: "postPage",
        action: function(params, queryParams) {
            BlazeLayout.render("nav", {yield: "postPage"} )
        }
    });

Затем, когда шаблон создан, вы подписываетесь с помощью подписки Meteor:

// Template onCreated
Template.postPage.onCreated(function() {
    // Subscribe only the relevant subscription to this page
    var self = this;
    self.autorun(function() { // Stops all current subscriptions
        var id = FlowRouter.getParam('id'); // Get the collection id from the route parameter
        self.subscribe('singlePost', id); // Subscribe to the single entry in the collection with the route params id
    });
});

Тогда помощником будет:

// Template helper functions
Template.postPage.helpers({
    thisPost: function() {
        // Get the single entry from the collection with the route params id
        var id = FlowRouter.getParam('id');
        var post = Posts.findOne({ // Get the selected entry data from the collection with the given id.
            _id: id
        }) || {};
        return post;
    }
});

Также нужно проверить, готовы ли подписки в html.

{{#if Template.subscriptionsReady}}
    {{#with thisPost}}
        <li>{{title}}</li>
    {{/with}}
{{else}}
    <p>nothing to show</p>
{{/if}}
person mesosteros    schedule 04.01.2016
comment
Спасибо, но все равно не работает... откуда функция публикации знает, что такое postId? Я нигде не определял это... На самом деле я копировал некоторые части кода из других мест, чтобы заставить его работать, но я думаю, что это та часть, где я больше всего запутался... спасибо - person AHH; 04.01.2016
comment
Подождите, я редактирую свой комментарий, потому что я заметил другие вещи. Не переживайте, у меня тоже была такая проблема. Подождите секунду ;) - person mesosteros; 04.01.2016
comment
Спасибо за подробный ответ и комментарии! теперь работает отлично! и я начну изучать все это, так как это будет обязательным для каждого приложения;) хорошего дня - person AHH; 04.01.2016
comment
Нет проблем ;) Я действительно рекомендую вам использовать это как часть шаблона для приложений Meteor. Это из моего :) Мне нужно было только преобразовать события в посты и все. - person mesosteros; 04.01.2016