JSON polymorphique : changer le type de modèle basé sur la réponse

Il est parfois utile d'intervenir sur le modèle de la réponse JSON en reconstruisant une sorte d'héritage entre structures. L'auteur vous explique comment faire en se basant sur un modèle parent et en obtenant deux sous-modèles distincts.
Cet article est la traduction de Polymorphic JSON: Changing the model type based on the responsePolymorphic JSON: Changing the model type based on the response publié sur ExtJS TutorialsExtJS Tutorials.

Article lu   fois.

Les deux auteur et traducteur

Site personnel

Traducteur :

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez

PARTY
id
name
getText() - retourne le nom
 
Sélectionnez

ORGANIZATION : PARTY
doingBusinessAs
getText() - retourne doingBusinessAs
 
Sélectionnez

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

 
Sélectionnez
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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2012 Neil McGuigan. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.