Ember js:制作动态路由和模型以及控制器
Ember js: Making dynamic routes and models and controllers
我必须为 12 条不同的路线复制相同的行为(嵌套路线、模型、控制器功能、存储功能)。唯一的区别在于它们的模型属性,模板也将为其更新。
因此,例如,我有两个名为 Notes 和 Tasks 的路由,它们以相同的方式获取并且在控制器中也具有相同的功能,但是 Tasks 路由具有属性 Subject 和 Text 而 Notes 具有 Name 和 Description 但即使是模板功能也是一样。
不为此类路由重复相同功能的最佳方法是什么?是否可以创建一个足够通用的模型或路线或控制器,以便 ember.js 可以决定 运行 时间来为每条路线做事?我可以为我拥有的 12 条不同路线重复使用一个 model/controller/route 的功能吗?
注意:惯用语 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'}}
覆盖模板名称:
<!-- 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
,同时分别保留显示名称 Name/Subject 和 Text/Description)。如果不是这种情况,您将需要一种方法来引用您想要在模板中引用的属性(例如,是否使用 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',
});
我必须为 12 条不同的路线复制相同的行为(嵌套路线、模型、控制器功能、存储功能)。唯一的区别在于它们的模型属性,模板也将为其更新。 因此,例如,我有两个名为 Notes 和 Tasks 的路由,它们以相同的方式获取并且在控制器中也具有相同的功能,但是 Tasks 路由具有属性 Subject 和 Text 而 Notes 具有 Name 和 Description 但即使是模板功能也是一样。
不为此类路由重复相同功能的最佳方法是什么?是否可以创建一个足够通用的模型或路线或控制器,以便 ember.js 可以决定 运行 时间来为每条路线做事?我可以为我拥有的 12 条不同路线重复使用一个 model/controller/route 的功能吗?
注意:惯用语 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'}}
覆盖模板名称:
<!-- 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
,同时分别保留显示名称 Name/Subject 和 Text/Description)。如果不是这种情况,您将需要一种方法来引用您想要在模板中引用的属性(例如,是否使用 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',
});