比如使用HttpProxy的load函数举例,
其为load( Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void
callback : Function
The function into which to pass the block of Ext.data.Records. The function must be passed
The Record block object
The "arg" argument from the load function
A boolean success indicator
它说第一个参数为The Record block object,对象到底是什么,在哪里定义的。
因为我看别人可以通过这个参数得到返回的record集合,也可以直接得到记录数等,
但是ext里也没有Ext.data.Records这个对象啊。它到底是怎么定义的呢,在哪定义的。
[b]问题补充:[/b]
我觉得应该不是[{},{},{}]的格式吧,还是觉得它就是一个对象。
因为我在一本书上看到是这么用的,假设参数名为result;
那么得到record集合,可以使用var records=result.records,
而集合数,可以这样得到:var count=result.totalRecords;
[b]问题补充:[/b]
【【也就是说你从服务器端得到的数据,会经过reader的转化,变成一个对象,在reader里面定义的这些totalRecords这些属性,你就可以调用了。 】】
我并不觉得这是reader转化后的一个对象。
这应该是这个callback函数参数对象的直接属性。教材上所用例子也没有在reader中定义那些属性。
而且,你不可能去定义records这个属性吧,这是返回记录集,你怎么定义?
返回的是个数组,你可以查看Store.js,在里面的说明中由于明确的文字描述
A function to be called after the Records have been loaded. The callback is
Scope with which to call the callback (defaults to the Store object)
add : BooleanIndicator to append loaded records rather than replace the current cache.
@return {Boolean} Whether the load fired (if beforeload failed). 而且在下面的loadRecords 的实现中表现的很明确,你可以看看 loadRecords : function(o, options, success){ if(!o || success === false){ if(success !== false){ this.fireEvent("load", this, [], options); } if(options.callback){ options.callback.call(options.scope || this, [], options, false); } return; } var r = o.records, t = o.totalRecords || r.length; if(!options || options.add !== true){ if(this.pruneModifiedRecords){ this.modified = []; } for(var i = 0, len = r.length; i < len; i++){ r[i].join(this); } if(this.snapshot){ this.data = this.snapshot; delete this.snapshot; } this.data.clear(); this.data.addAll(r); this.totalLength = t; this.applySort(); this.fireEvent("datachanged", this); }else{ this.totalLength = Math.max(t, this.data.length+r.length); this.add(r); } this.fireEvent("load", this, r, options); if(options.callback){ options.callback.call(options.scope || this, r, options, true); } },load( Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void
从配置的connection对象得到record数据块,并激发callback
params: 发起http请求时所要传递到服务端的参数
DataReader: 见DataReader
callback: 回叫方法,第一个参数为接收到的信息,第二个参数为arg,第三个是成功标志
scope: 范围
arg: 这儿的参数将会传递给回叫函数callback
使用示例:
[code="js"]
var proxy=new Ext.data.HttpProxy({url:'datasource.xml'});
var reader = new Ext.data.XmlReader({
totalRecords: "results",
record: "row",
id: "id"
}, [
{name: 'name', mapping: 'name'},
{name: 'occupation'}
]);
//定义回叫方法
var metadata;
function callback(data,arg,success){
if(success){
metadata=data;
}
}
//从connection配置的url中利用reader将返回的xml文件转为元数据,并传递给callback
proxy.load( null,reader,callback,this);
[/code]
Records其实就是由多个Record存放在一起的集合而已,如
[{},{},{}]是这样的格式
没错,我也发现了。
reader : Ext.data.DataReader
他是用来转化数据的。把数据转化成Ext.data.Records的形式。
也就是说你从服务器端得到的数据,会经过reader的转化,变成一个对象,在reader里面定义的这些totalRecords这些属性,你就可以调用了。
[quote]因为我在一本书上看到是这么用的,假设参数名为result;
那么得到record集合,可以使用var records=result.records,
而集合数,可以这样得到:var count=result.totalRecords;[/quote]
你看到的范例,就是这个原因。它已经被reader转化了。
也就是说,Record block object是原始的,未经过转化的数据,可能是json可能是xml,它需要你写一个reader来转换它,如果是xml,就写一个xml的reader,参看上面的范例代码。
楼上两位的说法都是正确的,当stroe.load()以后,它会把得到的数据缓存到这个stroe中的reader属性,而这个reader是一个Ext.data.DataReader对象。你可以在callback方法中通过store.reader.jsonData得到返回的数据。
你的理解似乎有偏差,你或许直接把你的教材的代码打出来看看。
data是callback的参数,callback回叫方法,接收到这个data,没有经过任何转化,那怎么可能有属性可以调用。就算你得到的是定义好的,设置好所有属性的一个JavaScript对象,你至少客户端也要eval这个js代码才可以用。这些框架都会处理.
至于你说没有定义reader就有这些参数可以调用,我觉得这或许它默认也会自己做解析.
或者你说看到的例子返回的就是一个js对象,并且带有records属性,这些属性都是它自定义的.你如果要定义这些属性,就那要去修改那个请求的数据源,比如说某个jsp生成了这个js对象,你修改这个jsp的代码,让这个js对象有这些属性.