注意: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',
});