Примечание: Idiomatic Ember 2.x поддерживает использование компонентов через контроллеры, но я ответил, используя контроллеры, потому что заданный вами контроллер.
Вы можете использовать наследование путем определения базового маршрута, который содержит вашу общую функциональность, и использует свойства, которые будут определены дочерними классами, чтобы настроить поведение.
// routes/base.js
import Ember from 'ember';
export default Ember.Route.extend({
// shared route definition
modelName: null,
attributes: [],
});
// routes/note.js
import BaseRoute from 'base';
export default BaseRoute.extend({
modelName: 'note',
attributes: ['name', 'description'],
});
// routes/task.js
import BaseRoute from 'base';
export default BaseRoute.extend({
modelName: 'task',
attributes: ['subject', 'text'],
});
Вы можете сделать то же самое для контроллеров. Наследования шаблонов нет, но вы можете либо использовать частичные, либо переопределить атрибут templateName
на маршруте.
Partials:
<!-- template/base.hbs -->
<p>Template Markup for {{modelName}}</p>
// controllers/note.js
import BaseController from 'base';
export default BaseController.extend({
modelName: 'note',
});
<!-- template/note.hbs -->
{{partial 'base'}}
Перекрытие TemplateName:
<!-- templates/base.hbs -->
<p>Base Template Markup</p>
// routes/note.js
export default BaseRoute.extend({
modelName: 'note',
attributes: ['name', 'description'],
templateName: 'base',
});
С наследованием, то проще, если ваши атрибуты фактически разделяют имя свойства и различаются только их отображаемое имя (например, атрибут для name
/subject
- title
, а атрибут для text
/description
- text
при сохранении отображаемых имен Название/Тема и Текст/Описание respectivel у). Если это не так, вам понадобится способ ссылаться на свойства, которые вы хотите ссылаться в шаблоне (например, использовать ли model.name или model.subject), и это станет довольно грязным. Гораздо легче определить displayForText
:
<!-- template/base.hbs -->
<p>{{displayForTitle}}: {{model.title}}</p>
<p>{{displayForText}}: {{model.text}}</p>
// controllers/note.js
import BaseController from 'base';
export default BaseController.extend({
displayForTitle: 'Name',
displayForText: 'Description',
});