2011-09-17 14 views
0

私はサーバーからJSONストアを自動的に生成するこのクラスを持っています。店舗はオンザフライで作成され、FirebugのDOMで表示できます。 Ext.Ajax.requestのコールバック関数 'AdminSettings'内にconsole.log(Ext.getStore( 'AdminSettings'))(AdminSettingsは作成されたストアの1つ)ストアが返されますが、console.log(Ext.getStore( 'AdminSettings'))をコールバック関数の外に置くと、ファイアバグで未定義のメッセージが表示され、ストアがインスタンス化されません。 実際の動作を確認するには、コードコメントを参照してください。javascript Ext.Ajax.requestのスコープの問題

Ext.Ajax.request({ 
url : './account/getadminstores', 
callback : function(options, success, response) { 
var json = Ext.decode(response.responseText); 
var adminStores = new Array(); 
// setup and intitialize on the fly stores 
for (var key1 in json) { 
var storeFields = new Array(); 
for (var key2 in json[key1]) {// if (i==1){break;} 
for (var key3 in json[key1][key2]) { 
storeFields.push(key3);} 
break;}; 
Ext.define('MA.store.' + key1, { 
extend : 'Ext.data.Store', 
fields : storeFields, 
storeId : key1, 
data : json[key1] 
}); 
Ext.create('MA.store.'+key1);}; 
console.log(Ext.getStore('AdminSettings')); 
//returns MA.store.AdminSettings in firebug and everything is fine 
       } 
      });//eof Ext.Ajax.request 
      console.log(Ext.getStore('AdminSettings')); 
//returns undefined which is strange 

答えて

1

Ext.Ajax.requestは非同期です。リクエストがまだ完了していないため、最後のconsole.logコールは何も返しません。リクエストのコールバックの結果に依存するコードは、コールバックによっても実行する必要があります。

+0

私は非同期thing.wouldあなたは解決策を提供してください?私は同期呼び出しを使用する必要がありますか?そのようなものが存在する?私はビューポートとグリッドを持っていると私はすぐにページがロードされますグリッドではなく、 'のストアは未定義です。 –

+0

Ext.Ajax.requestのコールバックから呼び出せる関数にグリッドの初期化コードをラップします。グリッドの準備が整うまで、カードレイアウトなどをプレースホルダとして使用する必要があります。つまり、ページがリクエストの結果に依存している場合は、すぐに使用できるように、ページ自体の一部としてクライアントにデータを配信するほうがよいでしょう。 – owlness

1

これは、javascriptの非同期性のために、callbackは、ajaxリクエストが終了するまで呼び出されないため、Extデータストアも定義されません。

スクリプトの実行の順序は次のとおりです。

  1. Ajaxリクエストは、(データストアはまだ定義されていないので、未定義)
  2. javascriptのを待っている
  3. にconsole.logが実行される初期化されます(データストアを定義する)
  4. 応答が入って​​くる
  5. ./account/getadminstoresからAJAX応答、コールバック関数が呼び出される
+0

ajaxリクエストが完了するまでレンダリングウィジェットを中断する方法はありますか? –