我正在寻找一个参考或答案,我认为这是一个非常常见的问题,当前实现JavaScript MVC框架的人(如Angular,Ember或Backbone)会遇到。
我正在寻找一种方法或通用模式来外化JS领域中可访问的应用程序属性。允许javascript加载服务器端属性的东西,例如应用程序根目录外部的端点,盐等。我遇到的问题是浏览器通常无法访问文件系统,因为这是一个安全问题。
因此,如果存在这样的事物,那么在可部署工件之外加载可配置属性的推荐方法是什么?
如果没有,目前正在使用或正在实施哪些被认为是针对此类问题的推荐方法?
我正在寻找一个交叉兼容的答案(Google Chrome很棒,我同意)。
答案 0 :(得分:1)
数据驱动的本地存储模式
想出来!!
我们的想法是根据约定配置命名加载配置属性,其中所有属性都是从目标主机名派生的。也就是说,主机名将派生一个可信端点,该端点将相应的属性加载到应用程序。这些应用程序属性将包含在运行时相对的信息。运行时信息将提供给集成部分,然后在引导启动时通过属性迭代进行通信。
为了简单起见,我们在这里只使用两个属性:
此实现特定于Ember JS,但总体思路应该是可移植的
我目前正在将这个问题的范围缩小到一个特定的技术视角,即Ember JS提供以下适用于我的补救措施,并希望它能帮助你解决同一问题的任何人。
启动时的Ember.Application.initializer实施
initialize: function (container, application) {
var origin = window.location.origin;
var host = window.location.hostname;
var port = window.location.port;
var configurationEndPoint = '';
//local mode
if(host === 'localhost'){
//standalone using api stub on NODEJS
if(port === '8000'){
configurationEndPoint = '/api/local';
}//standalone UI app integrating with back end application on same machine, different port
else{
configurationEndPoint = '/services/env';
}
origin += configurationEndPoint;
}else{
throw Error('Unsupported Environment!!');
}
//load the configuration from a trusted resource and store it in local storage on start up
$.get(origin,
function( data ) {
//load all configurations as key value pairs and store in localStorage for access.
configuration = data.configuration;
for(var config in configuration){
debugger;
var objectProperty = localStorage + '.' + config.toString()
objectProperty = configuration[config];
}
}
);
}
可配置适配器
export default DS.RESTAdapter.extend({
host: localStorage.host,
namespace: localStorage.namespace
});
答案 1 :(得分:0)
不迟于昨天早上,我正在解决同样的问题。
基本上,您有两种选择:
然后在您的app init代码中,您将获得此配置并使用它。理论上简单明了,但让我们深入讨厌(第二种选择)。
首先,客户端应该在应用程序加载之前获取配置。有时候并不容易。例如用户应该登录以查看配置。在我的情况下,我检查我是否可以在第一个请求上提供配置,如果没有将用户重定向到登录页面。这导致我们第二个限制。准备好提供配置后,您必须完全重新启动应用程序以便再次运行配置代码(至少在Angular中这是必要的,因为您无法在应用程序引导后访问提供程序)。
另一个约束,如果您使用静态html,第二个选项是无用的,并且在发送到客户端之前无法以某种方式在服务器上更改它。
可能更好的选择是结合两种变体。这应该可以解决返回用户的一些问题,但无论如何第一次互动都不会很愉快。我还没试过这个。