我有一个页面,其布局如下所示: 左侧有一个嵌套导航。在这种情况下,它显示:
如果选择了库,则会自动更新用于在库中显示书籍的列。选择一本书时,页面栏会自动更新该书中的所有页面等...
除此之外,还有一个主视图,显示当前所选实体的其他详细信息。在这种情况下,第2页(第2页):
________________________________
|*l1 | b1 | p1 | |
|----|----|----| |
| l2 |*b2 |*p2 | Main View |
|----|----|----| (p2 details) |
| l3 | | p3 | |
--------------------------------
这是仅选择库时的附加视图。它显示了选定的库,侧栏中该库中的所有书籍以及主视图中有关库的详细信息。
________________________________
|*l1 | b1 | |
|----|----| |
| l2 | b2 | Main View |
|----|----| (l1 details) |
| l3 | | |
--------------------------------
或只选择一本书时:
________________________________
|*l1 | b1 | p1 | |
|----|----|----| |
| l2 |*b2 | p2 | Main View |
|----|----|----| (b2 details) |
| l3 | | p3 | |
--------------------------------
因此,例如选择一个库时,主要有两个作业:
当使用嵌套路由时,导航本身可以正常工作:
Router.map(function() {
this.resource('libraries', { path: '/libraries' }, function() {
this.resource('books', { path: ':library'}, function() {
this.resource('pages', { path: ':book'});
});
});
});
在页面路线中,我只获取所选库的所有书籍并将其呈现到侧栏插座中:
export default Ember.Route.extend({
model: function (params) {
return this.store.find('book', {song: params.library});
},
renderTemplate: function() {
this.render({ outlet: 'sidebar-books' });
}
});
但是,到目前为止,当我尝试将有关当前所选库,书籍或页面的详细信息呈现到主视图和侧边栏视图时,我感到困惑。
我发现我可以向render
函数添加额外的renderTemplate
调用,这样我就可以向主视图呈现其他内容,但是我无法弄清楚如何检索我希望从商店中显示实体,因为任何其他路线都不会被调用。
建议为什么要做这样的事情?
答案 0 :(得分:3)
经过一番尝试和错误,在同一路线中加载两个模型并使用该模型渲染两个视图,似乎可以解决问题。
这是书籍路线。
路由/ books.js:
export default Ember.Route.extend({
model: function (params) {
return Ember.RSVP.hash({
books: this.store.find('book', {library: params.library}),
library: this.store.find('library', params.library)
})
},
renderTemplate: function(controller, model) {
this.render('books',{
outlet:'sidebar-books'
});
this.render('library');
}
});
在车把模板中,我现在可以通过以下方式访问库:
{{library.name}}
通过以下方式遍历书籍:
{{#each books}}
<div class="book">
<div>{{title}}</div>
</div>
{{/each}}
答案 1 :(得分:2)
动态菜单的侧面导航 使用嵌套路径渲染侧边菜单导航的示例更接近于codeySmurf描述的内容,虽然加载多个模型的主要问题尚未解决,但它已由codeySmurf解决。
http://emberjs.jsbin.com/begewoza/1/edit
使用静态菜单进行侧面导航
将侧边栏菜单与内容一起呈现的方法可能如下所示。假设不需要在主视图区域中将父模型与子项一起呈现(例如,同时在book1下面和该页面下面显示lib1),并且可以在模板中定义菜单,因此不能嵌套资源已被使用。该菜单已使用render
帮助程序呈现,但也可以使用named outlets
(名为outlet http://emberjs.jsbin.com/nibikufa/1/edit}。
http://emberjs.jsbin.com/hituxado/1/edit
<强> JS 强>
App = Ember.Application.create();
App.Router.map(function() {
this.route("allLibraries",{path:"/libraries"});
this.resource("library",{path:"/libraries/:library"});
this.resource("book",{path:"/libraries/:library/books/:book"});
this.resource("page",{path:"/libraries/:library/books/:book/pages/:page"});
});
App.IndexRoute = Ember.Route.extend({
redirect:function(){this.transitionTo("allLibraries");}
});
App.LibraryRoute = Ember.Route.extend({
model:function(params){
return {libId:params.library};
}
});
App.BookRoute = Ember.Route.extend({
model:function(params){
return {libId:params.library,bookId:params.book};
}
});
App.PageRoute = Ember.Route.extend({
model:function(params){
return {libId:params.library,bookId:params.book,pageId:params.page};
}
});
App.MenuView = Ember.View.extend({
});
<强> HBS 强>
<script type="text/x-handlebars">
<h2> Welcome to Ember.js</h2>
<div style="float:left">{{render "menu"}}</div>
<div style="float:left;margin-left:30%">{{outlet}}</div>
</script>
<script type="text/x-handlebars" data-template-name="allLibraries">
all libs
</script>
<script type="text/x-handlebars" data-template-name="library">
the library {{libId}}
</script>
<script type="text/x-handlebars" data-template-name="book">
the book {{libId}} - {{bookId}}
</script>
<script type="text/x-handlebars" data-template-name="page">
the page {{libId}} - {{bookId}} - {{pageId}}
</script>
<script type="text/x-handlebars" data-template-name="menu">
{{#link-to "allLibraries"}}all libs{{/link-to}}
<br/>
{{#link-to "library" 1}}lib 1
<br/>
{{#link-to "book" 1 1}}book 1
<br/>
{{#link-to "page" 1 1 1}}page1{{/link-to}}
{{/link-to}}
<br/>
{{#link-to "book" 1 2}}book 2
<br/>
{{#link-to "page" 1 2 2}}page2{{/link-to}}
{{/link-to}}
{{/link-to}}
<br/><br/>
{{#link-to "library" 2}}lib 2
<br/>
{{#link-to "book" 2 2}}book 2
<br/>
{{#link-to "page" 2 2 2}}page2 2{{/link-to}}
{{/link-to}}
{{/link-to}}
</script>
<强> CSS 强>
a.active{
background-color:lightgrey;
border-radius:4px;
margin:8px;
padding:4px;
}