我正在使用Ext JS 4.1創建一個CRM類型的應用程序。要連接到服務器端,我通過RemotingProvider
使用Ext Direct。如何避免由於Ext Direct和動態語言環境加載而導致的嵌套異步回調?
在應用程序啓動並呈現之前,我想通過Ext Direct從服務器檢索一些全局變量,主要是當前登錄用戶的配置語言及其配置的權限。然後,根據用戶的語言(從該結果),我需要加載Ext JS語言環境文件和我自己的自定義語言環境文件。 (請注意,這些必須被裝載在創建任何組件之前,因爲它們不會被事後應用。)
因此,該程序是:
- 通過
Ext.php.Globals.getGlobals
- 得到全局得到內線區域通過
Ext.loader.loadScript
, - 獲得通過應用程序的語言環境
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
調用層)?我自己的語言環境定義了一個類,但是Ext語言環境沒有。另外,這會不知怎麼搞砸編譯源文件Sencha Cmd?
感謝您的回答。對於您的建議,我有一些後續問題:2)如何在主視圖加載時「提供」語言和本地化?在詢問服務器後,我只知道正確的語言,而且我沒有看到同步加載區域設置文件的方法。 3)你可以擴展這個嗎?你會將我的'MyApp.util.hasPermission'移動到服務器上,以便每行都調用服務器嗎?我的應用程序有一個標籤界面,權限將決定加載哪些標籤。 – pulsar
@脈衝我編輯了我的文章 – sra
我猜你正在建議一種類似於Izhaki提出的方法。在那裏看到我的評論爲什麼這不起作用。 - 當然,在服務器端檢查訪問控制,但是如果不能使用,我想隱藏某些UI元素。關於「API匹配用戶訪問」部分:你是否建議我使用類似於:'Ext.php.User.hasPermission('usermgmt',function(data){if(data == true)app.getController(' usermgmt');})'? – pulsar