Extjs4与DWRproxy

时间:2013-05-24 09:27:45

标签: extjs proxy extjs4 dwr

我使用https://code.google.com/p/extjs4dwr中的dwrproxy.js并创建一个带商店的网格

Ext.onReady(function() {

    Ext.define('Record', {
        extend: 'Ext.data.Model',
        fields : [
            {name: 'clientName'},
            {name: 'type'}
        ],
        proxy : {
            type: 'dwr',
            dwrFunction : Manager.getList,

            reader : {
               type: 'json',
               root: 'data',
               totalProperty: 'count'
           }
        }
    })

    var store = Ext.create('Ext.data.Store', {
        requires : ['Ext.ux.DwrProxy'],
        model: 'Record'

    });

    var grid = new Ext.grid.GridPanel({
        store : store,
        columns: [
            {header: "clientName", width: 260, sortable: true, dataIndex: 'clientName'},
            {header: "type", width: 260, sortable: true, dataIndex: 'type'}
        ],
        title:'Test view',
        renderTo: 'container'
    });


    store.load();
});

Manager.getList看起来

  Manager.getList = function(p0, p1, callback) {
     dwr.engine._execute(Manager._path, 'Manager', 'getList', p0, p1, callback);
  }

我在dwr

中收到数据
throw 'allowScriptTagRemoting is false.';
//#DWR-INSERT
//#DWR-REPLY
var s0=[];var s2={};var s3={};
s2.clientName='Client1';s2.type='Type1';
s3.clientName='Client2';s3.type='Type2';
s1.descendingOrder=true;s1.pageNo=null;s1.pageSize=1;s1.sortField="lastEditTime";
dwr.engine._remoteHandleCallback('1','0',{data:s0,dataSize:2,fromIndex:0,fromIndexDisp:1,gridState:s1,metaData:null,moreData:null,pageNo:0,pageNumber:1});

一切看起来都不错,但网格仍然处于“加载”状态,并且没有视图。 请帮忙。

1 个答案:

答案 0 :(得分:0)

我对DWR一无所知,但通过模拟你的代码我们可以看到回调是作为getList()方法的第一个参数传递的,但是它期望它作为第三个参数。

回调参数的位置实际上取决于代理的dwrParams配置选项:

// adding parameters if there are defined any in proxy
// configuration
if (typeof (me.dwrParams) === 'object') {
    dwrParams = dwrParams.concat(me.dwrParams);
}

所以,你需要做的是在代理中配置你的参数:

    proxy : {
        type: 'dwr',
        dwrFunction : Manager.getList,

        // use params that are sensible for your function
        dwrParams: [1,2],

        // ... your reader config
    }

或者我想在加载商店之前设置这些可能更有意义:

store.proxy.dwrParams = [1,2];
store.load();

如果你想避免这种hackish方式,你可以覆盖代理的代码。例如,如果您替换这些行(在我的版本中从第71行开始):

// adding parameters if there are defined any in proxy
// configuration
if (typeof (me.dwrParams) === 'object') {
    dwrParams = dwrParams.concat(me.dwrParams);
}

通过这些:

// adding parameters if there are defined any in proxy
// configuration
var loadParams = operation.dwrParams || me.dwrParams;
if (typeof (loadParams) === 'object') {
    dwrParams = dwrParams.concat(loadParams);
}

然后您可以以干净的方式加载您的商店:

store.load({
    dwrParams: [3,4]
});

作为旁注,我在DwrProxy的代码中看到了一个错误。在同一个函数中,有一个代码使用了不存在的dwrParams0变量:

case 'read':
    me.dwrFunction.read.apply(null, dwrParams0);
    break;

我猜作者可能意味着dwrParams[0]。如果您需要为DwrProxy example中的不同CRUD操作使用不同的函数,则可能需要解决此问题。