Железный маршрутизатор, опубликуйте и подпишитесь

Итак, у меня есть простое представление, которое показывает проект и истории в этом проекте. В железном маршрутизаторе я называю это маршрутом projectShow:

@route 'projectShow', {   
  path: '/projects/:_id', 
  template: 'projectsShow'
}

Мой шаблон

<template name="projectsShow">
  <div class="row">         
    I'm a project            
    {{name}}
    <a href="#" id="add-story">New Story</a>
    {{#each stories}}
      Title: {{title}}
    {{/each}}
  </div>
</template>

Так что часть, которая меня сбивает с толку, — это правильный выбор данных с сервера и передача их клиенту. То, что я пробовал, публикуется так:

if Meteor.isServer
  Meteor.publish "projectAndStories", (id) ->
    [Projects.findOne({_id: id}), Stories.find({projectId: id})]

Что мне неясно, так это где и как правильно подписаться на это в роутере/клиенте, а также установить переменную сеанса, чтобы я мог ссылаться на текущий проект при добавлении новых историй.

Я попытался:

# in route
waitOn: ->
  Meteor.subscribe('projectAndStories', @params._id)
  Session.set('projectId', @params._id)

# template js file
  Template.projectShow.project = Projects.findOne({_id: Session.get('projectId')})
  Template.projectShow.stories = Stories.find({projectId: Session.get('projectId')})

Тем не менее, это не похоже на то, чтобы сделать это в шаблоне. Что я делаю не так?


person DVG    schedule 07.11.2013    source источник


Ответы (2)


В вашем примере вы возвращаете Session.set('projectId', @params._id) при закрытии waitOn.

Вы должны вернуть Meteor.subscribe. Просто поменяйте местами строки.


Проблем было больше, чем выше, поэтому я решил воссоздать ваш проект на js, и он работает. Пожалуйста, посмотрите репозиторий: https://github.com/parhelium/stackoverflow-iron-pub-sub

Проблемы, которые я заметил:

// Template.projectShow:   
{{name}} -> {{project.name}}

// waitOn closure should return:
Meteor.subscribe('projectAndStories', @params._id)

Проблема, с которой я столкнулся при создании вашего проекта:

// assign p to projectId, NOT p._id 
var p = Projects.insert({
    name: "Project #"+i,
});
Stories.insert({
    title: "Story #"+j,
    projectId:p
});

// check if data in mongo is correct, projectId was null in my case...
person Kuba Wyrobek    schedule 07.11.2013

Вы можете сделать это вместо waitOn

before: ->
    this.subscribe("projectAndStories",@params.id).wait();
    Session.set('projectId', @params._id)

Убедитесь, что вы установили loadingTemplate. Который будет отображаться до тех пор, пока подписка не будет завершена.

person Tarang    schedule 07.11.2013