Ember

时间:2015-05-18 22:02:43

标签: ember.js configuration ember-data ember-cli ember-cli-addons

我使用ember-cli构建我的应用程序,这为我提供了一个很好的app.js文件,我可以在静态资产服务器上进行服务。在部署时允许单独配置的最惯用方法是什么?

例如,我可能会告诉消费者我的app.js文件包含一个额外的config.[js|json]文件,该文件将被加载,该文件中的值将进入ENV对象...这样我就可以将应用程序指向不同的REST端点,例如(QA,Sandbox,预发布等),而无需重新编译。

我认为必须有办法,我只是没有看到它。我知道有config/environment.js文件,但它被编译到dist文件夹中。我正在寻找与打包的JS相邻的东西。我当然可以一起破解,所以我不是在寻找黑客。也许是ember-cli-addon?我认为必须有一个" ember方式"这样做。

我只是没找到它:)

1 个答案:

答案 0 :(得分:1)

好的,这就是我的所作所为。基本上,我允许主机应用程序覆盖一些设置。我注册了一个初始化程序,将它们插入到配置对象中,然后我像正常一样使用配置选项。看起来有点像这样:

<强>配置/ environment.js

// This is just normal ENV.APP configuration stuff.  Nothing odd here
module.exports = function(environment) {
  var ENV = {
    // snip
    APP: {
      API_HOST: 'http://defaultAPIHost.com',
      AUTH_PROVIDER: 'http://defaultAuthProvider.com'
    }
  };

  return ENV;
};

应用/初始化/参数overrides.js

import config from '../config/environment';

// This is the custom stuff.  If the values have been defined globally,
// override them on the config object.  I suppose this can be done a
// bit more dynamically, but this explicit code is for illustrative purposes.
export function initialize() {
  let apiOverride = window.MyAppEnv && window.MyAppEnv.API_HOST;
  let authOverride = window.MyAppEnv && window.MyAppEnv.AUTH_PROVIDER;

  config.APP.API_HOST = apiOverride || config.APP.API_HOST;
  config.APP.AUTH_PROVIDER = authOverride || config.APP.AUTH_PROVIDER;
}

export default {
  name: 'parameter-overrides',
  initialize: initialize
};

应用/适配器/应用

import DS from 'ember-data';
import config from '../config/environment';

// Then consume the config properties as you normally would
export default DS.RESTAdapter.extend({
    host: config.APP.API_HOST,
    namespace: "api"
});

现在,托管应用程序可以在页面中包含此内容,它将覆盖config/environment.js中的值:

<script type="text/javascript">
  // Override this value in production to the proper API host and Auth host
  window.MyAppEnv = {
    AUTH_PROVIDER: null, //'http://oauthhost.com/OAuth2'
    API_HOST: null //"http://apihost.com"
  };
</script>

这是一种合理的方法吗?那里有更好的东西吗?