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 的属性是 titletext/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',
});