Emberjs嵌套了路线和资源

时间:2014-12-15 17:57:31

标签: ember.js

这是一个我不确定如何回答的问题,我有一个这样的嵌套路线:

Router.map(function() {
    this.resource('pages', function(){
        this.resource('page', { path: '/:id' }, function(){
            this.route('edit', function(){
                this.resource('images', function(){
                    this.resource('image', { path: '/:id'}, function(){
                        this.route('edit');
                    })
                }); 
            });
        });
    });
});

但问题是,我不知道我的修改路线(this.route('edit', function(){}))应该是route还是resource

因为在我的应用中,我会像这样导航: (让我们把页面的id 1和图像的2)

/pages/ => /pages/1/ => pages/1/edit => /pages/1/edit/images => /pages/1/edit/images/2

但有一个问题是当我像这样设置{{link-to}}时:

page = this.modelFor(' page');

{{#each item in model}}
    {{#link-to "image" page item}}
        {{list-row item=item}} //component to display row in a table
    {{/link-to}}
{{else}}
    {{no-items}} 
{{/each}}

我的链接列表如下:

/pages/1/edit/images/1
/pages/2/edit/images/2
/pages/3/edit/images/3

就像页面ID使用与图片相同的ID,我不明白这是怎么回事:/

[编辑]:

当我点击/images/内的图片时,它会进行两次转换,我在控制台中将其作为调试:

      Rendering image with default view <webmob@view:default::ember844> Object {fullName: "view:image"}
vendor.js:28547 Could not find "image.index" template or view. Nothing will be rendered Object {fullName: "template:image.index"}
vendor.js:28547 Transitioned into 'pages.page.edit.images.image.index'
vendor.js:28547 Could not find "images.index" template or view. Nothing will be rendered Object {fullName: "template:images.index"}
vendor.js:28547 Transitioned into 'pages.page.edit.images.index'

[edit2]:

在我为我的网页创建了文件夹后(我对这些路线发出了相同的警告),它给了我这个:

Could not find "pages" template or view. Nothing will be rendered Object {fullName: "template:pages"}
vendor.js:28547 Rendering pages.index with default view <webmob@view:default::ember518> Object {fullName: "view:pages.index"}
vendor.js:28547 Transitioned into 'pages.index'

[edit3]:这是我的app结构如下所示的控制台输出:

- templates/
-    pages.hbs
-    page.hbs
-    //other resources


 generated -> route:pages.index Object {fullName: "route:pages.index"}
webmob/routes/pages.js:12 DEBUG: Already log in
VM69786:161 Ember Inspector Active
vendor.js:28547 Rendering application with default view <webmob@view:toplevel::ember480> Object {fullName: "view:application"}
vendor.js:28547 Rendering pages with default view <webmob@view:default::ember489> Object {fullName: "view:pages"}
vendor.js:28547 generated -> controller:pages.index Object {fullName: "controller:pages.index"}
vendor.js:28547 Could not find "pages.index" template or view. Nothing will be rendered Object {fullName: "template:pages.index"}
vendor.js:28547 Transitioned into 'pages.index'
vendor.js:28547 generated -> route:page.index Object {fullName: "route:page.index"}

我的一切都很好,但总是有警告。当我创建这样的页面文件夹时:

- templates/
    -    pages/
        - index.hbs //empty file
    -    pages.hbs
    -    page.hbs
    -    //other resources

我在我的控制台中有这个:

generated -> route:pages.index Object {fullName: "route:pages.index"}
webmob/routes/pages.js:12 DEBUG: Already log in
vendor.js:28547 Rendering application with default view <webmob@view:toplevel::ember419> Object {fullName: "view:application"}
vendor.js:28547 Rendering pages with default view <webmob@view:default::ember428> Object {fullName: "view:pages"}
vendor.js:28547 generated -> controller:pages.index Object {fullName: "controller:pages.index"}
vendor.js:28547 Rendering pages.index with default view <webmob@view:default::ember443> Object {fullName: "view:pages.index"}
vendor.js:28547 Transitioned into 'pages.index'
vendor.js:28547 generated -> route:page.index Object {fullName: "route:page.index"}
VM70411:161 Ember Inspector Active

1 个答案:

答案 0 :(得分:1)

在我的一个项目中,我偶然发现了类似的问题。我刚检查了我的源代码:

// Routing map
App.Router.map( function() {
    this.resource('projects', function() {
        this.resource('project', {path: ':name'}, function() {
            this.resource('edit', function() {
                this.resource('type', {path: '/type/:type_name'});
            });
        });
    });
});

我可以使用/projects/MyNewProject/edit/type/RandomType访问和编辑项目内的类型(因为我使用的是我的类型&#39;名称,而不是他们的ID)。

我记得注意到与您完全相同的行为:如果我在:nameproject资源中使用type,则生成的链接类似于/projects/MyNewProject/type/MyNewProject。因此,为:idpage资源设置相同的image参数可能是导致问题的原因。您可以针对:image_id资源尝试使用image,并为:id资源添加page

关于您问题的其他方面,关于您是否应该使用routeresource作为第一个edit路线:Ember Routing guide表示&#34;您应该将this.resource用于表示名词的URL,将this.route用于表示修饰这些名词的形容词或动词的URL。&#34;

但是在你的例子中它似乎并不那么简单,因为你有一个&#34;资源&#34;路由嵌套在&#34;动作&#34;路线。我认为你应该使用resource,因为路线的终点(图像)是一种资源。