具有多个属性关系的Ember非平凡路由器

时间:2015-04-17 15:51:29

标签: ember.js ember-data ember-router

我正在构建一个包含三个主要模型的项目管理应用程序:

ClientProjectTask

我的模型(仅限关系)

let client = DS.Model.extend({
  projects: DS.hasMany('project');
});

let project = DS.Model.extend({
  client: DS.belongsTo('client'),
  tasks: DS.hasMany('task')
});

let task = DS.Model.extend({
  project: DS.belongsTo('project')
});

要求:

  1. 显示所有客户的列表
  2. 显示所有客户项目的列表(未嵌套在UI中)
  3. 显示项目任务的列表(未嵌套在UI中)
  4. 显示任务的详细信息(未嵌套在UI中)
  5. 显示所有客户的所有项目列表(是的,不是嵌套的)

  6. 我不确定通过嵌套资源来反映模型关系是否不正确:

    /** Creates a nested UI by default: */
    this.route('clients', function() {
      this.route('projects', function() {
        this.route('tasks', function() {});
      });
    });
    

    我不希望我的UI嵌套并显示所有客户端下的所有项目等。


    有没有比这更好的处理资源的方法?

    // All projects for all clients
    this.route('projects', function(){});
    
    // Client's projects
    this.route('clientProjects', { path: 'client/:id/projects' }, function() {});
    

1 个答案:

答案 0 :(得分:1)

嵌套路由并不一定意味着您必须使用嵌套模板。每条路线都会创建其路线和索引子路线。你可以看到我对这个嵌套列表的意思。

* clients
    * clients.index
    * clients.projects
        * clients.projects.index
        * clients.projects.tasks
            * clients.projects.tasks.index

注意:我正在谈论at this link的内容也有更多的互动表达。

如果您查看树,可以看到clients.indexclients.projects的兄弟。因此,如果显示clients.projects模板,它将替换为clients.index,但仍位于clients之下。 clients.projects - >也是如此。 clients.projects.tasks个模板。

这种区别允许您在每个模板中放置您想要的任何内容,并将其保留(嵌套)或替换(不)。您可以充分利用所有这些模板来嵌套某些部分,而不是部分部分。

例如,如果您在clients模板中放置了一个客户菜单,并且您在clients.index模板中放置了包含所有客户端统计信息的概述页面,那么当您导航到clients.projects时模板,您仍会看到包含所有客户端的菜单,但概述模板将被替换。

您将使用默认的{{outlet}}为您创建未明确创建的任何模板,以便它们可以嵌套。因此,如果您没有创建clients模板并将所有内容放在clients.index模板中,它仍然有效,但当您导航到clients.projects模板时,所有内容都会被替换。< / p>


<强>资源

另请注意: resource将在2.0之前弃用,因此建议您在任何地方使用route


Ember-cli实施指令

$ ember new myapp && cd myapp
$ ember g route clients -p
$ ember g template clients/index -p
$ ember g route clients/projects -p
$ ember g template clients/projects/index -p
$ ember g route clients/projects/tasks -p