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

Ember.js Ember js:制作动态路线、模型和控制器,ember.js,ember-data,Ember.js,Ember Data,我必须为12条不同的路线复制相同的行为(嵌套路线、模型、控制器功能、存储功能)。唯一的区别在于它们的模型属性,模板也将更新。 例如,我有两个名为Notes和Tasks的路由,它们以相同的方式获取,在控制器中也有相同的功能,但是Tasks路由有属性,比如Subject和Text,而Notes有名称和描述,但即使模板功能也相同 对于此类路线,不重复相同功能的最佳方法是什么?是否可以创建一个足够通用的模型、路由或控制器,以便ember.js可以决定运行时为每个单独的路由执行操作?我可以为我拥有的12条

我必须为12条不同的路线复制相同的行为(嵌套路线、模型、控制器功能、存储功能)。唯一的区别在于它们的模型属性,模板也将更新。 例如,我有两个名为Notes和Tasks的路由,它们以相同的方式获取,在控制器中也有相同的功能,但是Tasks路由有属性,比如Subject和Text,而Notes有名称和描述,但即使模板功能也相同

对于此类路线,不重复相同功能的最佳方法是什么?是否可以创建一个足够通用的模型、路由或控制器,以便ember.js可以决定运行时为每个单独的路由执行操作?我可以为我拥有的12条不同路线重用一个模型/控制器/路线的功能吗

注意:惯用的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'],
});
您可以对控制器执行相同的操作。没有模板继承,但您可以使用partials或覆盖路由中的
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'}}
注意:惯用的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'],
});
您可以对控制器执行相同的操作。没有模板继承,但您可以使用partials或覆盖路由中的
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'}}