Ember js:制作动态路线,模型和控制器

时间:2016-09-26 04:11:09

标签: ember.js ember-data

我必须为12条不同的路由复制相同的行为(嵌套路由,模型,控制器功能,存储功能)。唯一的区别在于它们的模型属性,模板也将更新。 因此,例如,我有两条名为Notes和Tasks的路径,它们以相同的方式获取,并且在控制器中也具有相同的功能,但是任务路由具有主题和文本属性,而Notes具有名称和描述,但即使模板功能也是相同。

不对这些路线重复相同功能的最佳方法是什么?是否可以创建一个模型或路由或控制器足够通用,以便ember.js可以决定运行时间为每条路径做东西?我可以为我拥有的12种不同路线重用一种型号/控制器/路由功能吗?

1 个答案:

答案 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}} / textdescription,同时分别保留显示名称Name / Subject和Text / Description)。如果不是这种情况,您将需要一种方法来引用要在模板中引用的属性(例如,是否使用model.name或model.subject),这将变得非常混乱。定义text

要容易得多
displayForText