2015-04-17 3 views
0

Я строю приложение для управления проектами с тремя основными моделями:Ember нетривиальных маршрутизатор с несколькими BelongsTo отношений

Client, Project, Task

Мои модели (отношений) только

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. Отображение списка всех проектов для всех клиентов (да, не вложенная)

Я не уверен, если это неправильно REFL ЭСТ модели отношений по вложенности ресурсов как таковых:

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

Я не хочу, чтобы мой пользовательский интерфейс, чтобы быть вложенными и показать все проекты ниже всех клиентов и т.д.


Есть ли лучший способ обработки ресурсов, чем это?

// All projects for all clients 
this.route('projects', function(){}); 

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

ответ

1

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

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

Примечания: Существует также гораздо более интерактивное представление о том, что я говорю о at this link.

Если вы посмотрите на дерево, вы можете увидеть, что clients.index является родным братом до clients.projects. Поэтому, если отображается шаблон clients.projects, он заменит clients.index, но все равно будет находиться под clients. То же самое верно для шаблонов clients.projects ->clients.projects.tasks.

Это различие позволяет вам поместить все, что угодно в каждом шаблоне, и сохранить его (вложенным) или заменить (не). Вы можете полностью использовать все эти шаблоны, чтобы некоторые части были вложенными, а некоторые - нет.

Например, если поместить меню клиентов в clients шаблоне, и вы помещаете страницу обзора со статистическими данными о всех клиентах в clients.index шаблоне, при переходе к шаблону clients.projects, вы все равно будете видеть меню со всеми клиентами, но шаблон обзора будет заменен.

Любые шаблоны, которые вы явно не создадите, будут созданы для вас по умолчанию {{outlet}}, чтобы они были вложенными. Поэтому, если вы не создали шаблон clients и поместили все в шаблон clients.index, он все равно будет работать, но при замене шаблона clients.projects все будет заменено.


Ресурсы

Следует также отметить:resource устареет до 2.0, поэтому рекомендуется, что вы просто использовать route везде.


Ember-кли Выполнение команд

$ 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 
+0

Для тех из нас, менее знакомы с Ember * волшебной *, возможно, стоит отметить, что если вы не создавать определенные шаблоны для индекса клиентов, проектов и задач, вы увидите, что по умолчанию вложенный пользовательский интерфейс должен избегать. –

+0

Я добавил дополнительную информацию о шаблонах - я думаю, что когда вы говорите «поведение UI, чтобы избежать», это звучит так, как будто это плохо. Это то, что вы решили, что не хотите. Другие могут найти такое поведение желательным. –

+0

Отличный момент Майк! Очень ценю все. На этой точке кривой обучения Ember нет тонны индексированных ресурсов, поэтому ваша помощь была огромной. –

Смежные вопросы