Ember JS中如何基于其他环境变量更新关联的环境配置?
Ember JS 环境变量同步问题解答
问题结论
- 当请求来自移动端时,
ENV["tenantConfig"]["SG"]["accounts"]的值是 WEB-SG-ABC - index.js中对
ENV.channelCode的修改不会同步到tenantConfig的accounts字段中
原因说明
在environment.js中,tenantConfig.SG.accounts使用模板字符串${ENV.channelCode}-SG-ABC赋值时,会立即计算并生成静态字符串——此时channelCode的初始值是WEB,所以这个字段的值就被固定为WEB-SG-ABC。后续在index.js中修改ENV.channelCode,只会改变ENV.channelCode本身,不会重新触发模板字符串的计算,因此accounts的值不会更新。
解决方案
提供三种可行方案,按需选择:
方案1:在index.js中修改channelCode后重新设置tenantConfig
在移动端检测逻辑执行完毕后,重新赋值tenantConfig,确保使用最新的channelCode:
// index.js中的移动端检测代码之后添加 ENV.tenantConfig = { SG: { 'accounts': `${ENV.channelCode}-SG-ABC` } };
方案2:将tenantConfig的accounts改为动态getter
在environment.js中用getter定义accounts,这样每次访问该字段时都会重新计算,自动获取最新的channelCode:
// environment.js let ENV = { isMobile: false, channelCode: "WEB", tenantConfig: { SG: { get accounts() { return `${ENV.channelCode}-SG-ABC`; } } } };
注意:使用getter后,每次访问
ENV.tenantConfig.SG.accounts都会执行一次计算,适合需要实时获取最新值的场景。
方案3:将tenantConfig的定义移至index.js
如果业务允许,直接把tenantConfig的定义放到index.js中,在移动端检测完成后再初始化,确保使用正确的channelCode:
// index.js // 先执行移动端检测 if (/Mobi/.test(navigator.userAgent)) { ENV.isMobile = true; ENV.channelCode = "MOB"; } else { ENV.isMobile = false; } // 再初始化tenantConfig ENV.tenantConfig = { SG: { 'accounts': `${ENV.channelCode}-SG-ABC` } };
内容的提问来源于stack exchange,提问作者Apoorva Ojha
相关产品推荐
相关产品推荐

