Ext.data.Record 的基本法及其 API 帮助的一个 Bug

基本用法(不涉及其他相关类):

Ext.data.Record 实例就是对应一条记录,记录通常会放在数据集 Store 中,其中包含了数据的定义信息(字段名等) 和数据的值信息。这里不涉及与它相关的 Proxy、DataReader 和 Store,只单纯的用 Record 的方法。通常是两步,先调用 Record 的 create() 方法,返回一个类,然而 new 前面方法返回的类,代码过程如下:

代码说明:
Ext.data.Record  的 API 说明是:http://extjs.com/deploy/dev/docs/output/Ext.data.Record.html
Ext.data.Record 的源代码查看:http://extjs.com/deploy/dev/docs/source/Record.html#cls-Ext.data.Record

第一步 create() 方法返回的是一个 Function,从源代码中可以发现返回的是布司好了字段的 var f = Ext.extend(Ext.data.Record, {}); 实际为一个 Ext.data.Record 的子类,所以可用于后面的 new 操作。这一步相当于 C++ 的模板和 Java 的泛型,或者说预编译/创建出一个特定于数据表现的特化的类。create([Array o]) 中的 o 除了 name 外还可以包括几个重要属性,mapping 属性在用 JsonReader/XmlReader 获取数据里有用,type 属性用来指定当前字段的数据类型,使泛型更精致化。

第二步使用前一步返回的模板(Ext.data.Record 子类) new 一条具体的记录(Record 实例)。你在看 Record 的 API 帮助时看到它的构造函数一般不直接使用,而是丢给 create() 方法的返回类去调用。

其实在有些时候,也可以省去第一步的 create(),直接使用 Ext.data.Record 的构造函数,如:

执行后的效果与前面的一样。

令人费解的构造函数 API 帮助 Bug

直接看 ExtJs 2.0、ExtJs 2.2、ExtJs 3.0 中关于 Ext.data.Record() 构造函数的原型和参数说明:

1. ExtJs 2.0 的:Record( Array data, [Object id] ),data An associative Array of data values keyed by the field name.
2. ExtJs 2.2 的:Record( Array data, [Object id] ),data : Array An object, the properties of which provide values for the new Record's fields.
3. ExtJs 3.0 的:Record( [Object data], [Object id] ) data : Object (Optional) An object, the properties of which provide values for the new Record's fields. If not specified the defaultValue for each field will be assigned.

恰恰手中抱住是一本关于 ExtJs 2.0 的书,看的是 2.0 的 API,对于那个 Array data 参数实在是令人费解,一眼看去还以为一个 Record 实例可以表示多条记录呢。网上查查找到一篇介绍 Record  的 http://blog.csdn.net/alex197963/archive/2009/01/13/3766388.aspx,里面说以下两段代码是等价的。

说它们得到的 a 都可用于 var record = new a({Name:'test',Address:'where'});  其实这是有问题的,坏就坏在参数名 Array 混淆了视听,参数说明也是误人子弟。

对于开源的有疑问最好的办法还是去看源代码,看那个 Record 构造函数中的代码,对于传入的 data,用 this.data = data 存储下来。如果它真是一个数组,那调用 get : function(name){  return this.data[name];  }   来获取属性值是就会出错的。所以它是一个对象,且那个 API 说明的进化过程:

ExtJs 2.0 中的 Record 构造说明,参数名为 Array,且说明中也信誓旦旦的说那是一个数组
ExtJs 2.2 中的 Record 构造说明,参数名仍为 Array,但说明中松了口吻说是一个对象
ExtJs 3.0 中的 Record 构造说明,参数名和说明中终于是醒悟过来了,彻底承认了那是一个对象。

所以,不管你使用的是哪个版本的 ExtJs,一定要记得 Ext.data.Record() 构造函数的第一个参数是一个对象,而不是数组,它就是记录的数值,而不是用描述记录的。

本文链接 https://yanbin.blog/extjs-data-record-api-bug/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

2 Comments
Inline Feedbacks
View all comments