2014-10-02 1 views
1

У меня есть две коллекции:Две коллекции отображаются в URL через железо: router?

var Books = new Meteor.Collection("books"); 
var Chapters = new Meteor.Collection("chapters"); 

Chapter коллекция имеет propetry под названием bookId. Поэтому в каждой главе есть книга, и каждая книга имеет много глав.

Это маршрутизатор:

Router.map(function() { 
    this.route("bookList", { 
    path: "/", 
    data: function() { 
     return Books.find({}); 
    } 
    }); 
    this.route("bookPage", { 
    path: "/books/:_id", 
    data: function() { 
     return Books.findOne(this.params._id); 
    } 
    }); 
}); 

Так что теперь, когда я открываю книгу, я получаю и URL, как:

http://localhost:3000/books/TS23MTKrdpja2tCwq 

Но теперь я не знаю, как изменить код, чтобы я может открыть главу книги и в итоге получить URL-адрес:

http://localhost:3000/books/TS23MTKrdpja2tCwq/chapters/stwtwfd5tsrstfw 

Любая идея?

EDIT:

главы/chapter_page.js:

Template.chapterPage.helpers({ 
    chapters: function() { 
    Chapters.find({ 
     bookId: this._id 
    }, { 
     sort: { 
     position: 1 
     } 
    }); 
    } 
}); 

главы/chapter_item.html:

{{#with chapter}} 
    <h4><a class="open-chapter" href="{{pathFor 'chapterPage'}}">{{title}}</a></h4> 
{{/with}} 

ответ

1

Вы должны определить главу маршрута с два параметра.

_id В главном маршруте, очевидно, указывается глава, а имя свойства bookId должно быть таким же, как в коллекции глав, чтобы это работало.

Это позволит что-то вроде:

{{#with chapter}} 
    {{! 1.0.0-pre2 syntax}} 
    {{pathFor route="chapterPage"}} 
    {{! 0.9.3 syntax}} 
    {{pathFor "chapterPage"}} 
{{/with}} 

Чтобы вычислить автоматически главу URL данную главу документа.

Учитывая, что chapter ссылается на документ главы: наша функция data предоставляет свойство главы, которое действительно является документом главы.

EDIT:

Ваш chapters, вероятно, неправильно, потому что this._id вероятно не ссылается вообще ничего (нужно будет использовать что-то вроде this.chapter.bookId или this.book._id). Я бы включил главы в качестве результата в data:

this.route("chapterPage", { 
    path: "/books/:bookId/chapters/:_id", 
    data: function() { 
    var chapter=Chapters.findOne(this.params._id); 
    var book=Books.findOne(this.params.bookId); 
    var chapters=Chapters.find({ 
     bookId:this.params.bookId 
    },{ 
     sort:{ 
     position:1 
     } 
    }); 
    return { 
     chapter:chapter, 
     book:book, 
     chapters:chapters 
    }; 
    } 
}); 
+0

Большое спасибо. Что такое 'someChapter'? Как это сделать? – alexchenco

+0

В чем разница: '{{pathFor 'chapterPage'}}'? – alexchenco

+0

'someChapter' должен был представлять любой доступный хелпер шаблона, который ссылается на действительный документ главы (с' _id' и 'bookId', чтобы правильно построить URL-адрес). '{{PathFor route =" chapterPage "}}' является правильным синтаксисом для самой последней версии 'iron: router'. Отредактировал мой ответ, чтобы прояснить это. – saimeunt