1

我正在尝试使用单击网格中的名称时获得的服务器响应数据填写表单。在大多数情况下,我已经成功地做到了这一点。但是,由于某种原因,当我第一次单击网格中的名称时,我得到 store.proxy.reader.rawData 的“未定义”。我首先单击哪个名称并不重要,它总是这样做。任何后续点击都会返回预期的 json 字符串。我正在使用萤火虫来帮助我解决问题。

以下是我发出 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。下面的打印输出显示了前两个单击事件的 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 字符串的项目(它与第二次单击项目的信息相同,因为我单击了两次相同的名称)。下面的打印输出显示了这一点:

> $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 大约两个星期了,所以我很难看到任何细微的错误(甚至是明显的错误)。有人会指出我正确的方向吗?

谢谢你的帮助!-K

4

2 回答 2

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 回答
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 回答