注意:Ediomatic 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
属性。
局部模板:
<!-- 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
,同时保留显示名称名称/主题和文本/描述各自为1 Y)。如果情况并非如此,那么您将需要一种方法来引用您想要在模板中引用的属性(例如,是使用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',
});