2

ajax リクエストからアイテムを計算するツールバーを作成する必要があります。initComponent と buildItems の両方の関数を見てください。console.log を呼び出した後、builsItems メソッドで確認できるように、Ajax リクエストの実行が正しく行われたとしても、toolbar.items 要素の同じ結果が得られません。助けてください (私は初心者で、Extjs 4 を使用しています) どうもありがとう。

Ext.define('Dev.view.layout.Toolbarapp',{
   extend:'Ext.toolbar.Toolbar',
   alias :'widget.toolbarapp',
   border:false,
   height:35,
   initComponent:function(){
           this.items=[];
           Ext.Ajax.disableCaching=false;
           Ext.Ajax.request({
                        url : '/gdev/jsontest',
                        callback:this.buildItems,       
                        scope:this
           });  
       console.log(this.items); //THE RESULT IS []    
       this.callParent(arguments);
   },   
   buildItems:function(options, sucess, response){      
        if (sucess==true) {
            var listItems=[];
            var applist=Ext.JSON.decode(response.responseText);
            Ext.each(applist, function(rec){
                   listItems.push({'text'     :rec.appid,
                                   'iconCls'  :rec.iconcls,
                                   'operation':rec.appcode
                                  }
                                );                     
                 });
            this.items=listItems;   
            console.log(this.items); //THE RESULT IS [Object { text=100,      
    iconCls="appsysadmin", operation="appsysadmin"}, Object { text=101, 
    iconCls="appmailxe", operation="appmailxe"}]
        }
        else {
            Ext.MessageBox.alert('Error','not found');
        }

   }
   });
4

3 に答える 3

3

this.itemsへのオブジェクト表記コンポーネントの割り当ては、initComponent の callParent の前でのみ機能します。

その後、アイテムはすでに初期化されており、ext はその変更を取得しません。代わりにToolbar コンポーネントのadd メソッドを使用する必要があります。

buildItems メソッドでは、配列を作成するのではなく、オブジェクト表記コンポーネントを使用して add を呼び出すだけです。

var me = this;
Ext.each(applist, function(rec){
                   me.add({'text'     :rec.appid,
                                   'iconCls'  :rec.iconcls,
                                   'operation':rec.appcode
                                  }
                                );                     
                 });

私はそれをテストしていませんが、それが私がやった方法だと確信しています(頭の上から)

編集:スコープの変数を追加しました

于 2011-10-12T22:25:37.250 に答える
2

コンポーネントローダーを利用してみませんか? 参照: http://dev.sencha.com/deploy/ext-4.0.2a/examples/component-loader/component-loader.html

于 2011-10-13T00:53:36.980 に答える
0

最初のconsole.log呼び出しはコールバックの外にあるため、Ajaxリクエストが完了する前に呼び出されます。

2番目console.logの呼び出しでは、コールバック内で呼び出されています...これはAjaxリクエストが終了した後に開始されます。基本的に、Ajaxリクエストから返されたデータを使用することを期待している場合は、コールバックですべての作業を行う必要があります。

于 2011-10-12T22:01:39.387 に答える