I. Explications▲
J'utilise le Party Model et j'aimerais créer un modèle Individual ou Organization en fonction de la réponse JSON. Pour faire cela, je dois réécrire le Ext.data.reader.Reader. Idéalement, Sencha aurait déclenché un événement "création de modèle" qui nous permettrait d'intercepter le modèle au moment du Read.
Le Party Model est un modèle de conception de base de données relationnelle qui consiste à trouver des points communs entre plusieurs entités et à les synthétiser dans des tables plus abstraites.
II. Les modèles▲
Les objets ressemblent à ceci :
PARTY
id
name
getText
(
) -
retourne le nom
ORGANIZATION
:
PARTY
doingBusinessAs
getText
(
) -
retourne doingBusinessAs
INDIVIDUAL
:
PARTY
middleName
firstName
birthday
getText
(
) réécriture -
retourne le nom complet
Il faut manier correctement les champs et les associations qui sont redéfinis. Vous devez utiliser le nom de la propriété qui appartient à l'autre modèle pour la réécrire.
III. Un exemple▲
Ext.
data.
reader.
Reader.override
({
extractData
:
function(
root){
var me =
this,
records =
[],
Model =
me.
model,
length =
root.
length,
convertedValues,
node,
record,
i;
if (!
root.
length &&
Ext.isObject
(
root)) {
root =
[
root];
length =
1
;
}
for (
i =
0
;
i <
length;
i++
) {
node =
root[
i];
/* réécriture */
if(
me.
types){
var typeCode =
node[
me.
typeProperty ||
'type'
];
var type =
me.
types[
typeCode];
me.
model =
Ext.
ClassManager.get
(
type);
//la référence du modèle est utilisée dans d'autres fonctions
Model =
me.
model;
me.buildExtractors
(
true);
//il faut recompiler les Extractors
}
/* fin de la réécriture */
record =
new Model
(
undefined,
me.getId
(
node),
node,
convertedValues =
{}
);
record.
phantom =
false;
me.convertRecordData
(
convertedValues,
node,
record);
records.push
(
record);
if (
me.
implicitIncludes) {
me.readAssociated
(
record,
node);
}
}
return records;
}
}
);
//voici comment vous l'utiliseriez
Ext.define
(
'My.model.Party'
,
{
extend
:
'Ext.data.Model'
,
requires
:[
'TD.model.Individual'
,
'TD.model.Organization'
],
fields
:[
'id'
,
'type'
,
'name'
,
{
name
:
'text'
,
mapping
:
'name'
}
],
proxy
:{
type
:
'ajax'
,
url
:
'parties'
,
reader
:
{
root
:
'parties'
,
types
:{
'i'
:
'My.model.Individual'
,
'o'
:
'My.model.Organization'
}
}
}
}
);
//le json
{
success
:
true,
parties
:[
{
id
:
4
,
type
:
'i'
,
name
:
'chief'
,
firstName
:
'el'
,
middleName
:
'_'
,
birthday
:
'May 1'
},
{
id
:
99
,
type
:
'o'
,
name
:
'Sencha, Inc.'
,
doingBusinessAs
:
'Sencha'
}
]
}
Votre structure parties contiendrait alors un objet Individual et un objet Organization.
IV. Remerciements▲
Cet article a été publié avec l'aimable autorisation de Neil McGuigan. L'article original peut être lu sur le blog ExtJS TutorialsExtJS Tutorials : Polymorphic JSON: Changing the model type based on the responsePolymorphic JSON: Changing the model type based on the response.
Je remercie également FirePrawn pour sa relecture rapide.