158 lines
No EOL
7.1 KiB
HTML
158 lines
No EOL
7.1 KiB
HTML
<html><head><title>JsonReader.js</title><link rel="stylesheet" type="text/css" href="../resources/style.css" media="screen"/></head><body><h1>JsonReader.js</h1><pre class="highlighted"><code><i>/**
|
|
* @class Ext.data.JsonReader
|
|
* @extends Ext.data.DataReader
|
|
* Data reader class to create an Array of Ext.data.Record objects from a JSON response
|
|
* based on mappings <b>in</b> a provided Ext.data.Record constructor.
|
|
* <p>
|
|
* The code below lists all configuration options.
|
|
* <pre><code>
|
|
<b>var</b> RecordDef = Ext.data.Record.create([
|
|
{name: 'name', mapping: 'name'}, <i>// "mapping" property not needed <b>if</b> it's the same as "name"</i>
|
|
{name: 'occupation'}, <i>// This field will use "occupation" as the mapping.</i>
|
|
]);
|
|
<b>var</b> myReader = <b>new</b> Ext.data.JsonReader({
|
|
totalProperty: "results", <i>// The property which contains the number of returned records (optional)</i>
|
|
root: "rows", <i>// The property which contains an Array of record objects</i>
|
|
id: "id" <i>// The property within the record object that provides an ID <b>for</b> the record (optional)</i>
|
|
}, RecordDef);
|
|
</code></pre>
|
|
* <p>
|
|
* This would consume a JSON file like <b>this</b>:
|
|
* <pre><code>
|
|
{ 'results': 2, 'rows': [
|
|
{ 'id': 1, 'name': 'Bill', occupation: 'Gardener' },
|
|
{ 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]
|
|
}
|
|
</code></pre>
|
|
* @cfg {String} totalProperty Name of the property from which to retrieve the total number of records
|
|
* <b>in</b> the dataset. This is only needed <b>if</b> the whole dataset is not passed <b>in</b> one go, but is being
|
|
* paged from the remote server.
|
|
* @cfg {String} successProperty Name of the property from which to retrieve the success attribute used by forms.
|
|
* @cfg {String} root name of the property which contains the Array of row objects.
|
|
* @cfg {String} id Name of the property within a row object that contains a record identifier value.
|
|
* @constructor
|
|
* Create a <b>new</b> JsonReader
|
|
* @param {Object} meta Metadata configuration options
|
|
* @param {Object[]/Ext.data.Record constructor} recordType The record definition of the data record to produce.
|
|
*/</i>
|
|
Ext.data.JsonReader = <b>function</b>(meta, recordType){
|
|
Ext.data.JsonReader.superclass.constructor.call(<b>this</b>, meta, recordType);
|
|
};
|
|
Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
|
|
<i>/**
|
|
* This method is only used by a DataProxy which has retrieved data from a remote server.
|
|
* @param {Object} response The XHR object which contains the JSON data <b>in</b> its responseText.
|
|
* @<b>return</b> {Object} data A data block which is used by an Ext.data.Store object as
|
|
* a cache of Ext.data.Records.
|
|
*/</i>
|
|
read : <b>function</b>(response){
|
|
<b>var</b> json = response.responseText;
|
|
<b>var</b> o = eval("("+json+")");
|
|
<b>if</b>(!o) {
|
|
throw {message: "JsonReader.read: Json object not found"};
|
|
}
|
|
<b>return</b> this.readRecords(o);
|
|
},
|
|
|
|
<i>/**
|
|
* @ignore
|
|
*/</i>
|
|
simpleAccess: <b>function</b>(obj, subsc) {
|
|
<b>return</b> obj[subsc];
|
|
},
|
|
|
|
<i>/**
|
|
* @ignore
|
|
*/</i>
|
|
getJsonAccessor: <b>function</b>(){
|
|
<b>var</b> re = /[\[\.]/;
|
|
<b>return</b> function(expr) {
|
|
try {
|
|
<b>return</b>(re.test(expr))
|
|
? <b>new</b> Function("obj", "<b>return</b> obj." + expr)
|
|
: <b>function</b>(obj){
|
|
<b>return</b> obj[expr];
|
|
};
|
|
} catch(e){}
|
|
<b>return</b> Ext.emptyFn;
|
|
};
|
|
}(),
|
|
|
|
<i>/**
|
|
* Create a data block containing Ext.data.Records from an XML document.
|
|
* @param {Object} o An object which contains an Array of row objects <b>in</b> the property specified
|
|
* <b>in</b> the config as 'root, and optionally a property, specified <b>in</b> the config as 'totalProperty'
|
|
* which contains the total size of the dataset.
|
|
* @<b>return</b> {Object} data A data block which is used by an Ext.data.Store object as
|
|
* a cache of Ext.data.Records.
|
|
*/</i>
|
|
readRecords : <b>function</b>(o){
|
|
<i>/**
|
|
* After any data loads, the raw JSON data is available <b>for</b> further custom processing.
|
|
* @type Object
|
|
*/</i>
|
|
<b>this</b>.jsonData = o;
|
|
<b>var</b> s = <b>this</b>.meta, Record = <b>this</b>.recordType,
|
|
f = Record.prototype.fields, fi = f.items, fl = f.length;
|
|
|
|
<i>// Generate extraction functions <b>for</b> the totalProperty, the root, the id, and <b>for</b> each field</i>
|
|
<b>if</b> (!<b>this</b>.ef) {
|
|
<b>if</b>(s.totalProperty) {
|
|
<b>this</b>.getTotal = <b>this</b>.getJsonAccessor(s.totalProperty);
|
|
}
|
|
<b>if</b>(s.successProperty) {
|
|
<b>this</b>.getSuccess = <b>this</b>.getJsonAccessor(s.successProperty);
|
|
}
|
|
<b>this</b>.getRoot = s.root ? <b>this</b>.getJsonAccessor(s.root) : <b>function</b>(p){<b>return</b> p;};
|
|
<b>if</b> (s.id) {
|
|
<b>var</b> g = <b>this</b>.getJsonAccessor(s.id);
|
|
<b>this</b>.getId = <b>function</b>(rec) {
|
|
<b>var</b> r = g(rec);
|
|
<b>return</b> (r === undefined || r === "") ? null : r;
|
|
};
|
|
} <b>else</b> {
|
|
<b>this</b>.getId = <b>function</b>(){<b>return</b> null;};
|
|
}
|
|
<b>this</b>.ef = [];
|
|
<b>for</b>(var i = 0; i < fl; i++){
|
|
f = fi[i];
|
|
<b>var</b> map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
|
|
<b>this</b>.ef[i] = <b>this</b>.getJsonAccessor(map);
|
|
}
|
|
}
|
|
|
|
<b>var</b> root = <b>this</b>.getRoot(o), c = root.length, totalRecords = c, success = true;
|
|
<b>if</b>(s.totalProperty){
|
|
<b>var</b> v = parseInt(<b>this</b>.getTotal(o), 10);
|
|
<b>if</b>(!isNaN(v)){
|
|
totalRecords = v;
|
|
}
|
|
}
|
|
<b>if</b>(s.successProperty){
|
|
<b>var</b> v = <b>this</b>.getSuccess(o);
|
|
<b>if</b>(v === false || v === 'false'){
|
|
success = false;
|
|
}
|
|
}
|
|
<b>var</b> records = [];
|
|
<b>for</b>(var i = 0; i < c; i++){
|
|
<b>var</b> n = root[i];
|
|
<b>var</b> values = {};
|
|
<b>var</b> id = <b>this</b>.getId(n);
|
|
<b>for</b>(var j = 0; j < fl; j++){
|
|
f = fi[j];
|
|
<b>var</b> v = <b>this</b>.ef[j](n);
|
|
values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue);
|
|
}
|
|
<b>var</b> record = <b>new</b> Record(values, id);
|
|
record.json = n;
|
|
records[i] = record;
|
|
}
|
|
<b>return</b> {
|
|
success : success,
|
|
records : records,
|
|
totalRecords : totalRecords
|
|
};
|
|
}
|
|
});</code></pre><hr><div style="font-size:10px;text-align:center;color:gray;">Ext - Copyright © 2006-2007 Ext JS, LLC<br />All rights reserved.</div>
|
|
</body></html> |