Ext.data.store以JSON格式发布的POST数据

时间:2012-03-03 17:39:21

标签: javascript json extjs extjs4 http-post

我正在尝试使用EXT JSON存储来使用JSON发送数据,但它似乎不起作用。 这是一个简单的代码:

       var myStore = new Ext.data.Store({
    //model: 'User',
    proxy: {
        type: 'ajax',
        url: '/users.svc',
        reader: {
            type: 'json',
            root: 'users'
        },
        writer: {
            type: 'json',
            root: 'data'
        },
        actionMethods: {
            create: 'POST', read: 'POST', update: 'POST', destroy: 'POST'
        },
        extraParams: { test: 'test' }
    },
        listeners: {
            beforeload: function (store, operation, options) {
                //alert(operation.params);
            }
        },
    autoLoad: true
});

由于我定义了JSON“writer”,我期望参数可以使用JSON发送到服务器。 但是它仍然使用以下正文进行常规POST: test=test&page=1&start=0&limit=25

虽然我的期望是POST应该具有以下正文:{test:'test',page:1,start:0}

我将不胜感激任何帮助

P.S。我正在使用EXTJS 4.0.7

2 个答案:

答案 0 :(得分:2)

proxy.read总是使用params,而不是jsonData,所以store.load不能发布json

http://ahlearns.wordpress.com/2012/08/16/ext-js-4-load-a-data-store-using-json-params/

Ext.define('Ext.ux.data.proxy.JsonAjaxProxy', {
extend:'Ext.data.proxy.Ajax',
alias:'proxy.jsonajax',

actionMethods : {
    create: "POST",
    read: "POST",
    update: "POST",
    destroy: "POST"
},

buildRequest:function (operation) {
    var request = this.callParent(arguments);

        // For documentation on jsonData see Ext.Ajax.request
        request.jsonData = request.params;
        request.params = {};

        return request;
},

/*
 * @override
 * Inherit docs. We don't apply any encoding here because
 * all of the direct requests go out as jsonData
 */
applyEncoding: function(value){
    return value;
}

});

希望这有帮助!

答案 1 :(得分:0)

proxy定义移至model

E.g。

Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'email'],
proxy: {
    type: 'ajax',
    url: '/users.svc',
    reader: {
        type: 'json',
        root: 'users'
    },
    writer: {
        type: 'json',
        root: 'data'
    },
    actionMethods: {
        create: 'POST', read: 'POST', update: 'POST', destroy: 'POST'
    },
    extraParams: { test: 'test' }
}
});

然后像这样配置商店:

 var myStore = new Ext.data.Store({
   model: 'User'
   });

商店将使用模型中指定的代理。 希望这有帮助!