При переходе на FlowRouter нужно что-то похожее на контекст данных шаблона.

Итак, я много читал об обсуждении Iron Router и FlowRouter.

Я начал свой проект с помощью Iron Router, но с тех пор передумал и сейчас перехожу на FlowRouter.

Все шло гладко, пока я не начал переносить раздел комментариев в своем приложении. Видите ли, этот раздел повторно используется в приложении несколько раз, он служит разделом комментариев для новостей, сообщений, фотографий, видео и т. д.

Пример использования контекста данных IR:

Router.route('/news/:slug', {
   name: 'newsItem',
   waitOn: function() { Meteor.subscribe('news.single', this.params.slug) },
   data: function() {
      return News.findOne({slug: this.params.slug});
   }
});

<template name="newsItem">
  <p>{{title}}</p>
  <p>{{body}}</p>
  {{> commentSection}}
</template>

Схема коллекции комментариев имеет «тип» (чтобы знать, к какому типу «вещи» относится этот комментарий, новостям, фотографиям и т. д.). Этот тип был установлен в событии form .submit шаблона commentSection. Пример:

'submit form': function(e, template) {
  e.preventDefault();
  var $body = $(e.target).find('[name=body]');
  console.log(template.data.type);
  var comment = {
    type: template.data.type,
    parentId: template.data._id,
    parentSlug: template.data.slug,
    body: $body.val()
  };
  Meteor.call('insertComment', comment, function(error, commentId) {
    if (error){
      alert(error.reason);
    } else {
      $body.val('');
    }
  });
}

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

Как я мог добиться чего-то подобного только с помощью Flow Router без установки данных в шаблоне, как это рекомендуется в официальном руководстве?


person pedropeixoto    schedule 02.02.2016    source источник


Ответы (1)


Возможно, вы захотите использовать подписку на шаблон и помощника {{#with}}.

Template.newsItem.onCreated( function() {
    Template.instance().subscribe('news.single', FlowRouter.current().params.slug);
});

Template.newsItem.helpers({
    item() {
        let item = News.findOne();
        if( item ) {
            return item;
        }
    }
});

<template name="newsItem">
    {{#with item}}
        <!-- Your existing stuff -->
    {{/with}}
</template>
person Stephen Woods    schedule 02.02.2016
comment
Да я это уже делал. Однако я не включил в него свой {{› commentSection }}. Ваш комментарий заставил меня сделать это, поэтому я приму его как ответ. Спасибо! - person pedropeixoto; 02.02.2016