我正在尝试使用在网格中单击名称时获得的服务器响应数据来填充表单。在大多数情况下,我已经成功地做到了这一点。但是,出于某种原因,我第一次点击网格中的名字时,我得到了store.proxy.reader.rawData的“undefine”。我先点击哪个名称并不重要,它总是这样做。任何后续点击都会返回预期的json字符串。我正在使用firebug来帮助我解决问题。
以下是我发出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是“undefine;但是,当我为第一次单击扩展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
答案 0 :(得分: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 });
}
答案 1 :(得分: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);
}
});