Ответ 1
Большинство изменений, которые я сделал, находятся в вашем html и шаблоне. Пожалуйста, не перепутайте ссылку Handlebars-helper с классическими anchors() и не изменяйте атрибут link-to tagname или, по крайней мере, дважды подумайте перед этим. Сначала переместите testData на глобально доступный объект, чтобы вы могли использовать его в меню:
JavaScript:
App.CustomRoutes = [{
id: 1,
title: 'single'
}, {
id: 2,
title: 'subpages',
pages: [{
id: 3,
title: 'subpage1'
}, {
id: 4,
title: 'subpage2'
}, {
id: 5,
title: 'subpage3'
}]
}];
Html:
<ul class="navbar-nav nav">
{{#each page in App.CustomRoutes}}
<li class='menu-item'>
{{#link-to 'page' page.title}}
{{page.title}}
{{#if page.pages}}
<b class="caret"></b>
{{/if}}
{{/link-to}}
<span class='subpages'>
<ul>
{{#each subpage in page.pages}}
<li>
{{#link-to 'page.subpage' page.title subpage.title}}
{{subpage.title}}
{{/link-to}}
</li>
{{/each}}
</ul>
</span>
</li>
{{/each}}
</ul>
Затем я исправил объявление вашего маршрутизатора. Когда вы определяете вложенные маршруты, третий параметр this.resource() - это функция, аналогичная функции, которую вы передаете в App.Router.map().
App.Router.map(function () {
this.resource('page', {path: '/:page_id'},
function() { this.route('subpage', {path: '/:subpage_id'});});
});
Наконец, вот определения ваших маршрутов. Поскольку Subpage вложен в страницу, маршрут должен быть вызван PageSubpageRoute. Если он был вложен в Foo, это был бы FooSubpageRoute. ПРИМЕЧАНИЕ. Вызов this.render() внутри маршрутизатора имеет следующие параметры: (,).
App.PageSubpageRoute = Ember.Route.extend({
model: function(params) {
var parentModel = this.modelFor('page');
var res = $.grep(parentModel.pages, function (e) {
if (e.title == params.subpage_id) {
return e;
}
});
return res[0];
},
serialize: function(model) {
return { subpage_id: model.title};
},
renderTemplate: function() {
this.render('subpage');
}
});
App.PageRoute = Ember.Route.extend({
serialize: function(model) {
return { page_id: model.title};
},
model: function (params) {
return $.grep(App.CustomRoutes, function (e) {
if (e.title == params.page_id) {
return e;
}
})[0];
}
});
Вот код: jsbin