我必须为12条不同的路由复制相同的行为(嵌套路由,模型,控制器功能,存储功能)。唯一的区别在于它们的模型属性,模板也将更新。 因此,例如,我有两条名为Notes和Tasks的路径,它们以相同的方式获取,并且在控制器中也具有相同的功能,但是任务路由具有主题和文本属性,而Notes具有名称和描述,但即使模板功能也是相同。
不对这些路线重复相同功能的最佳方法是什么?是否可以创建一个模型或路由或控制器足够通用,以便ember.js可以决定运行时间为每条路径做东西?我可以为我拥有的12种不同路线重用一种型号/控制器/路由功能吗?
答案 0 :(得分:2)
注意:惯用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
以及{的属性,则最简单{1}} / text
为description
,同时分别保留显示名称Name / Subject和Text / Description)。如果不是这种情况,您将需要一种方法来引用要在模板中引用的属性(例如,是否使用model.name或model.subject),这将变得非常混乱。定义text
:
displayForText