「構成」データを保持する config.js モジュールを追加することをお勧めします。サーバーから構成データを取得してキャッシュするための初期化関数を追加します。
次に... shell.js の activate 関数で、ビューをバインドする前に構成を初期化します。
次に、すべてのビューモデルで構成モジュールを要求すると、キャッシュされたデータのみが返されます。
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;
});
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 モジュールを要求し、appconfig.contentRoot を使用して contentRoot にアクセスできます。