私は Ext JS 4.1 を使用して CRM タイプのアプリケーションを作成しています。サーバー側に接続するために、 経由で Ext Direct を使用していRemotingProvider
ます。
アプリケーションを起動してレンダリングする前に、Ext Direct を介してサーバーからいくつかのグローバル変数を取得したいと考えています。主に、現在ログインしているユーザーの構成済み言語と構成済みのアクセス許可です。次に、(その結果から) ユーザーの言語に応じて、Ext JS ロケール ファイルと独自のカスタム ロケール ファイルの両方を読み込む必要があります。(これらは後で適用されないため、コンポーネントを作成する前にロードする必要があることに注意してください。)
したがって、手順は次のとおりです。
- 経由でグローバルを取得
Ext.php.Globals.getGlobals
Ext.loader.loadScript
経由でExt ロケールを取得します。- アプリのロケールを取得する
Ext.loader.loadScript
- ビューポートの設定
1.-3. 非同期であるため、コールバックをネストする以外に方法はありませんでした。
Ext.application({
name: 'MyApp',
launch: function() {
var app = this;
// Welcome to callback hell...
Ext.php.Globals.getGlobals(function(data) {
// insert globals into app namespace
Ext.apply(MyApp, data);
// load ext locale
Ext.Loader.loadScript({
url: 'ext/locale/ext-lang-'+MyApp.currentUser.culture.toLowerCase()+'.js',
onLoad: function() {
// load app locale
Ext.namespace('MyApp.locale');
Ext.Loader.loadScript({
url: 'app/locale/'+MyApp.currentUser.culture.toUpperCase()+'.js',
onLoad: function() {
// FINALLY, set up viewport
var viewport = Ext.create('MyApp.view.Viewport', {
controller: app
});
if (MyApp.util.hasPermission('usermgmt'))
app.getController('Locations');
// and so on ...
}
});
}
});
});
}
}); // end application
このコードを書くための他のよりエレガントな方法はありますか? 非同期フロー用のライブラリがあることは知っていますが、これらのいずれかがここで Ext JS API と連携できますか? または、どうにかExt.syncRequire
してロケールを強制的にロードすることはできますか (そのため、getGlobals
呼び出し用のネストのレイヤーは 1 つしかありません)。私自身のロケールにはクラスが定義されていますが、Ext ロケールには定義されていません。また、これはSencha Cmdを使用してソースファイルをコンパイルする際に何らかの形で台無しになりますか?