0

これが起こっていることです。ストアの data プロパティを使用してデータをハードコーディングすると正常に動作するリストがありますが、プロキシを使用しようとすると何も表示されません...プロキシはデータを送信することができます &サーバーからデータを受信しますが、リストには何も表示されません...

これはビューです:

Ext.define('MyApp.view.myListView', { 
extend: 'Ext.List',
xtype: 'myListView',
requires: ['MyApp.store.myListStore'],
config: {
    title: 'American Companies',
    grouped: false,
    itemTpl: '{company} {contact}',
    store: 'myListStore',
    onItemDisclosure: true
}});

モデル:

Ext.define('MyApp.model.myListModel', {  
    extend: 'Ext.data.Model',
    config: {
    fields: ['company', 'contact']
   }
});

店舗:

Ext.define('MyApp.store.myListStore', {
    extend: 'Ext.data.Store',


    requires: ['MyApp.model.myListModel', 'MyApp.proxy.myListProxy'],


    config: {
        model: 'MyApp.model.myListModel',
        proxy: 'searchProxy',
        autoLoad: true,
        grouper: {
            groupFn: function (record) {
                return record.get('contact').substr(0, 1);
            }
        }
    }
}); 

プロキシ:

Ext.define('MyApp.proxy.myListProxy', {
    extend: 'Ext.data.proxy.Ajax',
    alias: 'proxy.searchProxy',
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    },
    callbackKey: 'callback',
    type: 'json',
    config: {
        model: 'MyApp.model.myListModel',
        url:  '/myUrl that works',   
        reader: {
            type: 'json',
            rootProperty: 'data' // E.g. {results: [{id: 123, description: 'some     text'}, {...}]},
        }
    },
    read: function (operation, callback, scope) {
           Ext.Ajax.request({
            url: '/myUrl that works',   
            //success: passFn,   // function called on success
            failure: failFn,
            jsonData: {
                "data": {
                    "fields": ["company", "contact"],
                }
            }
        });

    },


    filterParam: undefined,


    /**
     * NOTE: so I can add other params as I needed the params for a search request
     * You could use extraParams instead
     */
    buildRequest: function(operation) {
        var request = this.callParent(arguments);
        var params  = request.getParams();
//        var searchRequest = getSearchRequest(); // helper method
//        if (searchRequest) {
//            Ext.apply(params, searchRequest);
//        }
        return request;
    }


});


function failFn(msg) {
    Ext.Msg.alert('Ajax Error', msg);
}
4

1 に答える 1

2

readオーバーライドを次のように変更します-

read: function (operation, callback, scope) {
    var that = this;

    Ext.Ajax.request({
        url: 'yout_url_here',
        success: function(response,request){
            var receivedData = Ext.JSON.decode(response.responseText.trim());

            operation.setResultSet(Ext.create('Ext.data.ResultSet', {
                records: receivedData.data,
                total  : receivedData.data.length
            }));

            operation.setSuccessful();
            operation.setCompleted();

            if (typeof callback == "function") {
                callback.call(scope || that, operation);
            }
        },
        failure: failFn,
        jsonData: {
            "data": {
                "fields": ["company", "contact"]
            }
        }
    });

},

readメソッドのドキュメントに従って -

指定された読み取り操作を実行します。カスタム プロキシでこのメソッドをオーバーライドする場合は、操作が完了したら、提供されたコールバック メソッドを必ず呼び出すようにしてください。

したがって、そのコールバックを再度呼び出す必要があります。しかし、それを呼び出すだけでは十分ではありません。サービスから受信したデータを に割り当てる必要がありますExt.data.Operation。そのため、新しいResultSetデータを作成して割り当てる必要があります。これにより、ストアはデータをリストに割り当てることができます。設定されていない場合ResultSet、ストアにはデータがロードされません。

次のjsonでこれを試してみましたが、うまくいきました-

{
   "data":[
      {
         "company":"a",
         "contact":"b"
      },
      {
         "company":"a",
         "contact":"b"
      },
      {
         "company":"a",
         "contact":"b"
      },
      {
         "company":"a",
         "contact":"b"
      }
   ]
}

これを試してみてください。しかし、私見では、おそらくメソッドをオーバーライドする必要はありませんread。受信したデータをリストに添付する前に処理したい場合は、このメソッドが必要になることがあります。あなたがこれを望んでいるかどうかはわかりません。

しかし、上記の解決策は私にとってはうまくいきました。:)

于 2013-05-04T11:30:29.450 に答える