1

グリッド内の名前をクリックするたびに取得したサーバー応答データをフォームに入力しようとしています。ほとんどの場合、私はこれを行うことに成功しました。ただし、何らかの理由で、グリッド内の名前を初めてクリックすると、store.proxy.reader.rawDataの「未定義」が表示されます。最初にクリックする名前は関係ありません。常にこれを行います。それ以降のクリックは、予期されたjson文字列を返します。私は問題を解決するためにfirebugを使用しています。

以下は、ajaxリクエストを行うストア「PersonS」のコードです。

Ext.define('CX.store.PersonS',
{
    extend: 'Ext.data.Store', 
    model: 'CX.model.PersonM',
    autoLoad: false,
    proxy:
    {
        type: 'ajax',
        actionMethods: {
            update:'POST'
        },
        url: '.../CensusXPHP/app/store/getUserIdInfo.php',
        reader: 
        {
            type: 'json'
        }    
    }
});

上記のストアがロードされるコントローラ内の機能は次のとおりです。

showMess: function(grid,record)
    {
        var tempId = record.get('transId');                         //grab translation ID
        var name = record.get('fname') + ' ' + record.get('lname'); //grab name of current user
        var store = this.getPersonSStore();
        store.load(
        {
            params:{cid:tempId}
        })               

        var info = store.data;
        console.log(info)
        console.log(store.proxy.reader.rawData)
    }
};

store.dataオブジェクトとstore.proxy.reader.rawDataの2つをコンソールに出力しています。すぐ下のプリントアウトは、最初の2つのクリックイベントのPOSTおよびコンソールのプリントステートメントを示しています。

> POST http:app/store/getUserIdInfo.php?_dc=1339179358498  
> Object { items=[0], map={...}, keys=[0], more...}
> 
> POST http:/app/store/getUserIdInfo.php?_dc=1339179359680  
> Object { items=[1], map={...}, keys=[1], more...} Object { id="123", bday="1/5/89", payPref="credit", more...}

両方とも同じ名前をクリックしました。ご覧のとおり、store.dataオブジェクトは、最初のクリックではアイテムがゼロであり、rawDataは「未定義です。ただし、最初のクリックでstore.dataオブジェクトの情報を展開すると、実際にjson文字列を含むアイテム(同じ名前を2回クリックしたため、2回目のクリックアイテムと同じ情報です)。以下の印刷出力は次のことを示しています。

> $className    "Ext.util.MixedCollection"   
>.    
>.     
>.           
>   -items: [Object {internalId="123", raw={...}, data={...}, more...}]         
>   --0: Object {internalId="123", raw={...}, data={...}, more...}  
>   ---$className: "CX.model.PersonM"       
>   ---$inheritableStatics: ["setProxy","getProxy", "load"] 
>   ---alternateClassName: "Ext.data.Record"    
>   ---associations: Object { items=[0], map={...}, keys=[0], more...}  
>   ---onfig: Object {}         
>   ---data: Object { bday="1/5/89", street="123 Main St", city="Los Angeles", more...}         
>   ---defaultProxyType: "ajax"     
>   ---dirty:           false       
>   ---editing:         false   
>.   
>.   
>.  

何が起こっているのかわかりません。私はExtJSを約2週間使用しているので、微妙なエラー(または明白なエラー)を確認するのは困難です。誰かが私を正しい方向に向けてくれませんか?

ご協力いただきありがとうございます!-K

4

2 に答える 2

0

store.loadメソッドは非同期であるため、呼び出し後、データのロードを開始し、制御を返します。showMess初めて呼び出すときrawDataは、この時点ではまだデータがロードされていないため、は未定義です。別の呼び出しごとに、前の要求の結果が表示されます。loadたとえば、イベントを使用します。

showMess: function(grid,record)
{
    var tempId = record.get('transId');                         //grab translation ID
    var name = record.get('fname') + ' ' + record.get('lname'); //grab name of current user
    var store = this.getPersonSStore();
    store.load(
    {
        params:{cid:tempId}
    });            

    store.on('load', function() {
        var info = store.data;
        console.log(info);
        console.log(store.proxy.reader.rawData);
    }, this, { single: true });
}
于 2012-06-08T18:46:29.190 に答える
0

Loloが述べたように、store.loadは非同期です。イベントを使用する代わりに、コールバックを使用することもできます。

store.load(
{
  params: {cid:tempId},
  callback: function(records, operation, success){
       var info = records;
       console.log(info);
       console.log(store.proxy.reader.rawData);
  }
});
于 2014-06-19T18:47:48.720 に答える