I. Les règles

  1. Mettez le proxy dans le modèle, à moins d'avoir une très bonne raison de ne pas le faire. L'objet héritera du proxy du modèle, et vous pourrez toujours le réécrire par la suite si nécessaire.
  2. Utilisez toujours le nom complet du modèle.
  3. Définissez à chaque fois un getterName.
  4. Définissez à chaque fois un setterName.
  5. Positionnez la propriété associationKey si l'objet externe est retourné dans la même réponse que cet objet.
  6. Définissez toujours la propriété foreignKey si vous souhaitez charger l'objet externe à volonté.
  7. Pensez à modifier l'instanceName en quelque chose de plus court.
  8. L'accesseur get se comporte différemment selon que l'objet externe soit chargé ou non. S'il est chargé, l'objet externe est retourné. Sinon, vous devez passer par une fonction de rappel (callback) pour l'obtenir.
  9. Vous devez définir la propriété name si vous prévoyez de passer outre cette association.
  10. Vous n'avez pas besoin d'une relation belongsTo pour qu'une association de type hasMany fonctionne.
  11. Ajoutez la propriété primaryKey si l'identifiant du modèle parent n'est pas le champ id.
  12. Parfois, vous avez besoin ou vous devez utiliser des associations de type "appartient à". Surveillez bien les références circulaires.
  13. Appeler la fonction setter() ne semble pas affecter l'instance. Si vous voulez appeler le setter(), définissez ceci : object.belongsToInstance = obj.

II. Un exemple

 
Sélectionnez
Ext.define('Assoc.model.PhoneNumber', {
   extend:'Ext.data.Model',

   fields:[
       'number',
       'contact_id'
   ],

   belongsTo:[
   {
        model:'Assoc.model.Contact',
        getterName:'getContact',
        setterName:'setContact',
        associationKey:'contacts',
        foreignKey:'contact_id',
        instanceName:'contact'
   }
   ],

   proxy:{
       type:'ajax',
       url:'assoc/data/phone-numbers.json',
       reader:{
           type:'json',
            root:'phoneNumbers'
       }
   }
});

/*
 * En supposant que le modèle Contact utilise un proxy AJAX avec l'URL "contacts",
 * et que son identifiant est le champ id, l'appel de la fonction ci-dessous
 * fera une demande HTTP comme celle-ci : /contacts?id=88
 */

var pn = new Assoc.model.PhoneNumber( { contact_id:88 } );

pn.getContact( function(contact, operation){
 console.log('Chargement du contact. this.contact contient maintenant les informations du contact.');
} );

III. 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 : Rules for BelongsTo Associations in ExtJSRules for BelongsTo Associations in ExtJS.
Je remercie également FirePrawn pour sa relecture rapide.