Code:
Ext.define('Test', {
extend : 'Ext.data.Model',
fields : ['12345', '67890']
});
Ext.require('Ext.data.*');
Ext.onReady(function() {
Ext.define('ReaderOverride', {
override: 'Ext.data.reader.Reader',
buildRecordDataExtractor: function() {
var me = this,
modelProto = me.model.prototype,
clientIdProp = modelProto.clientIdProperty,
fields = modelProto.fields.items,
numFields = fields.length,
fieldVarName = [],
varName,
i = 0,
field,
code = [
'var me = this,\n',
' fields = me.model.prototype.fields,\n',
' value,\n',
' internalId'
];
for (; i < numFields; i++) {
field = fields[i];
fieldVarName[i] = '_' + Ext.String.createVarName(field.name);
code.push(',\n ', fieldVarName[i], ' = fields.get("', field.name, '")');
}
code.push(';\n\n return function(dest, source, record) {\n');
for (i = 0; i < numFields; i++) {
field = fields[i];
varName = fieldVarName[i];
// createFieldAccessExpression must be implemented in subclasses to extract data from the source object in the correct way.
code.push(' dest', ((field.name === varName) ? ('.' + varName) : ('["' + field.name + '"]')), ' = ', me.createFieldAccessExpression(field, varName, 'source'), ';\n');
}
// set the client id as the internalId of the record.
// clientId handles the case where a client side record did not previously exist on the server,
// so the server is passing back a client id that can be used to pair the server side record up with the client record
if (clientIdProp) {
code.push(' if (internalId = ' + me.createFieldAccessExpression({mapping: clientIdProp}, null, 'source') + ') {\n');
code.push(' record.internalId = internalId;\n }\n');
}
code.push(' };');
return Ext.functionFactory(code.join('')).call(me);
}
});
var store = Ext.create('Ext.data.Store', {
model : 'Test',
data : {
records : [{
'12345' : 1,
'67890' : 'foo'
}, {
'12345' : 2,
'67890' : 'bar'
}]
},
proxy : {
type : 'memory',
reader : {
type : 'json',
root : 'records'
}
}
});
store.each(function(rec){
console.log(rec.get('12345'), rec.get('67890'));
});
});
It should be merged into a nightly build over the next few days.