用于重复使用的Ember DRY模式" Ember.computed.alias"

时间:2015-07-21 20:54:22

标签: javascript ember.js

我有一个转换为多个视图的表单。目前,每个controller.js文件都包含这些Ember.computed.alias的长列表。如何将其分解为一个文件并将其导入每个控制器?

目前在每个controller.js

entityEmail: Ember.computed.alias('controllers.checkout.entityEmail'),
entityDOB: Ember.computed.alias('controllers.checkout.entityDOB'),
entityPhone: Ember.computed.alias('controllers.checkout.entityPhone'),
entityAddress1: Ember.computed.alias('controllers.checkout.entityAddress1'),
entityAddress2: Ember.computed.alias('controllers.checkout.entityAddress2'),
entityCity: Ember.computed.alias('controllers.checkout.entityCity'),

我想把所有内容都放到一个文件中,这样我就可以在每个controller.js中导入一些内容。

1 个答案:

答案 0 :(得分:2)

这是Ember.Mixin的经典用例 你可以将所有这些计算出的道具提取到一个mixin中,并用它扩展每个控制器(需要有这些道具)。

将以下mixin添加到您的应用

// app/mixins/entity-form.js

import Ember from 'ember';

const { Mixin, inject, computed: { alias } } = Ember;

export default Mixin.create({

  checkout: inject.controller(),

  entityEmail: alias('checkout.entityEmail'),
  entityDOB: alias('checkout.entityDOB'),
  entityPhone: alias('checkout.entityPhone'),
  entityAddress1: alias('checkout.entityAddress1'),
  entityAddress2: alias('checkout.entityAddress2'),
  entityCity: alias('checkout.entityCity')

});

然后在控制器中使用它

// app/controllers/example.js

import EntityFormMixin from 'yourAppName/mixins/entity-form';

const { Controller } = Ember;

export default Controller.extend(EntityFormMixin, {
  // rest of controller's props and functions
});

注意:Ember.inject APIEmber 1.10.0起可用。如果您使用的是旧版本,则需要将注入行替换为:needs: ['checkout'],并在别名前添加"controllers."前缀,就像您在示例中所做的那样。