ajax代理的URL - Ext JS

时间:2014-03-17 14:18:10

标签: extjs

我对url代理的ajax字段以及Ext.Ajax.request

有几个问题

我从Ext.Ajax.request收到JSON回复,并将该数据发送到store。 (我也试图使用目前非常不合作的pagingToolbar

无论如何,当我使用ajax代理时,分页似乎只是稍微工作,但是我不确定要把什么作为URL。目前是url: ''

var store = Ext.create('Ext.data.Store', {
            storeId     : 'resultsetstore',
            autoLoad    : false,
            pageSize    : itemsPerPage,
            fields: [ 
                {name   : 'id',         type    : 'auto'}, 
                {name   : 'name',       type    : 'auto'}, 
                {name   : 'description', type   : 'auto'}
            ],
            proxy: {
                type    : 'ajax',
                url     : '???', 
                reader: {
                    type    : 'json',
                    root    : 'elements'
                }
            }

});

似乎url从特定目录中的.json文件中读取数据(即url: 'myData/data.json'),但是没有任何类似的文件可以读取,因为我{ {1}}将作为 JSON对象返回。

这是我的response,我解析并发送给request/response

store

单独请求是多余的吗? 我可以单独在我的商店中完成此操作(将我的var request = Ext.Ajax.request({ url : 'MCApp', //here I specify the Servlet to be read from jsonData : searchquery, //A JSON Object params:{ start:0, limit: itemsPerPage }, success : function(response) { mainresponse = response.responseText; //etc. } 作为参数传递给服务器和所有爵士乐吗?

我提前为这个混乱的问题道歉!

干杯

2 个答案:

答案 0 :(得分:2)

您可以使用内存代理并使用data属性设置商店数据,但我不建议这样做。

如果我在哪里,我会忘记ajax请求,并开始利用商店的代理。

这是一个例子

var store = Ext.create('Ext.data.Store', {
    storeId: 'resultsetstore',
    autoLoad: false,
    pageSize: 20,
    fields: ['id','name','description'],
    proxy: {
        type: 'ajax',
        url: 'urlToTheServlet', //here I specify the Servlet to be read from
        extraParams: {
            searchquery: 'Test'
        }, //A String Object                
        reader: {
            type: 'json',
            root: 'elements'
        }
    }
});

store.load();

请注意,开始,限制将在后台处理。您不必手动设置它们。您可以设置pageSize,但它有自己的默认值,因此不需要。

这是您的数据预期的样子:

{
    "elements": [
        {
            "id": 1,
            "name": "John",
            "description": "Project Manager"
        },
        {
            "id": 2,
            "name": "Marie",
            "description": "Developer"
        },
        {
            "id": 3,
            "name": "Tom",
            "description": "Technical Lead"
        }
    ]
}

更新: 将对象作为有效负载传递给代理

我遇到了同样的问题,我无法找到开箱即用的解决方案,所以我编写了自己的代理来解决这个问题。

Ext.define('BCS.data.proxy.AjaxWithPayload', {
    extend:  'Ext.data.proxy.Ajax' ,
    alias: 'proxy.ajaxwithpayload',

    actionMethods: {
        create: "POST",
        destroy: "POST",
        read: "POST",
        update: "POST"
    },
    buildRequest: function(operation) {
        var me = this,
            request = me.callParent([operation]);
        request.jsonData = me.jsonData;
        return request;
    }
});

现在你可以这样做:

var store = Ext.create('Ext.data.Store', {
    storeId: 'resultsetstore',
    autoLoad: false,
    pageSize: 20,
    fields: ['id','name','description'],
    proxy: {
        type: 'ajaxwithpayload',
        url: 'urlToTheServlet', //here I specify the Servlet to be read from
        jsonData : YOUR_OBJECT
        reader: {
            type: 'json',
            root: 'elements'
        }
    }
});

答案 1 :(得分:0)

我更喜欢将每个方法保存在一个单独的端点中:

proxy: {
    type: 'ajax',
    reader: {
        type: 'json'
    }, 
    api: {
        read: 'getCenarioTreeNode', // To request a node children (expand a node)
        create: 'createCenarioTreeNode', // When you insert a node
        update: 'updateCenarioTreeNode', // When you change a node attribute
        destroy: 'destroyCenarioTreeNode' // When you delete a node
    },        
    writer: {
        type:'json',
        encode:true,
        rootProperty:'data'
    }        
},