我建议你添加一个config.js模块来保存你的“配置”数据。添加一个初始化函数以从服务器获取配置数据并缓存它。
然后...在你的shell.js的激活函数中,在绑定你的视图之前初始化配置。
然后,您可以在您的所有视图模型中要求您的配置模块,并且它只会返回缓存的数据。
config.js
define(['dataaccessmodule'], function (dataaccessmodule) {
var config =
{
serviceRoot: null,
init: init
};
var init= function()
{
// get config from server and set serviceRoot;
// return a promise
};
return config;
});
shell.js
define([... your required modules..., 'config'],
function (..., config) {
function activate() {
return config.init().then(boot);
};
function boot() {
// set up routing etc...
// activate the required route
return router.activate('home');
};
});
someViewModel.js
define([... your required modules..., 'config'],
function (..., config) {
var someViewModel =
{
serviceRoot: config.serviceRoot
};
return someViewModel;
});
我知道你所述T您不希望通过ajax加载数据,但使用这种方法,您只需加载一次并重新使用它。如果需要,您也可以加载额外的配置。这很好地使用单一职责原则分离代码。
编辑:
如果你真的需要做的是在渲染页面,你可以沿着这些路线做一些事情:
<script>
var myapp = myapp || {};
myapp.config= (function() {
var contentRoot = "<?=$this->contentRoot?>";
return {
contentRoot: contentRoot
};
})();
</script>
然后,在你main.js,定义之前主模块,可以短路它使用:
define('appconfig', [], function() { return myapp.config; });
然后,您可以要求您的视图模型了AppConfig模块,你通常W¯¯应该使用appconfig.contentRoot访问contentRoot。
thx的详细回应,如果它不符合我的条件,它会工作得很好。但是我不能通过ajax从服务器“获取”我的配置,因为配置是服务器URL本身。该应用程序托管在各种主机/路径/子路径上,因此知道服务根URL的唯一可靠方法就是服务器本身。这就是为什么Ajax技术不适合我的原因。如果可能的话,我想避免在JS中使用发现逻辑。 –
看我的编辑。我希望有所帮助。 –
你编辑的回复有点怪异,但是那么我的超级全球黑客就少得多了。你能不能在主机页面做定义权利? –