我建议您添加一个 config.js 模块来保存您的“配置”数据。添加一个初始化函数以从服务器获取配置数据并缓存它。
然后... 在你的 shell.js 的激活函数中,在绑定你的视图之前初始化配置。
然后,您可以在所有视图模型中要求您的配置模块,它只会返回缓存的数据。
配置.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;
});
外壳.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;
});
我知道你说过你不想通过 ajax 加载数据,但是使用这种方法,你只会加载一次并重新使用它。如果需要,您还可以加载额外的配置。这使用单一职责原则很好地分离了代码。
编辑:
如果您真的需要在渲染页面中执行此操作,您可以按照以下方式执行操作:
<script>
var myapp = myapp || {};
myapp.config= (function() {
var contentRoot = "<?=$this->contentRoot?>";
return {
contentRoot: contentRoot
};
})();
</script>
然后,在您的 main.js 中,在定义主模块之前,您可以使用以下方法将其短路:
define('appconfig', [], function () { return myapp.config; });
然后,您可以像往常一样在 viewmodel 中要求 appconfig 模块,并使用 appconfig.contentRoot 访问 contentRoot。