I. Les règles▲
- 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.
- Indiquez toujours (requires) les modèles enfants si vous les utilisez dans l'association hasMany. Pour le faire facilement et pour éviter les éventuelles références circulaires, vous pouvez les intégrer dans votre fichier application.js.
- Utilisez toujours la propriété foreignKey si vous souhaitez charger les objets enfants à volonté.
- Utilisez toujours la propriété associationKey si vous retournez les objets enfants dans la même réponse que l'objet parent.
- Si vous le souhaitez, vous pouvez combiner les propriétés foreignKey et associationKey.
- Donnez systématiquement un nom à votre association hasMany.
- Utilisez toujours le nom complet du modèle dans votre association hasMany.
- Si vous utilisez un Reader JSON, pensez à donner à la racine du lecteur un nom significatif.
- Vous n'avez pas besoin d'une relation belongsTo pour qu'une association de type hasMany fonctionne.
II. Un exemple▲
Ext.define
(
'Assoc.model.Contact'
,
{
extend
:
'Ext.data.Model'
,
requires
:[
'Assoc.model.PhoneNumber'
/* règle 2 */
],
fields
:[
'name'
/* le champ id est hérité de Ext.data.Model */
],
hasMany
:[
{
foreignKey
:
'contact_id'
,
/* règles 3 et 5 */
associationKey
:
'phoneNumbers'
,
/* règles 4 et 5 */
name
:
'phoneNumbers'
,
/* règle 6 */
model
:
'Assoc.model.PhoneNumber'
/* règle 7 */
}
],
proxy
:{
/* règle 1 */
type
:
'ajax'
,
url
:
'assoc/data/contacts.json'
,
reader
:
{
type
:
'json'
,
root
:
'contacts'
/* règle 8 */
}
}
}
);
// exemple :
var c =
new Assoc.
model.Contact
({
id
:
99
}
);
/*
* En supposant que PhoneNumber.proxy est un proxy AJAX et que son URL est positionnée
* à 'phonenumbers', la fonction ci-dessous fera une requête HTTP comme celle-ci :
* /phonenumbers?page=1&start=0&limit=25&filter=[{"property":"contact_id","value":"99"}]
* Par exemple, on pourrait faire une requête pour tous les numéros de téléphone
* mais en demandant au serveur de les filtrer sur le contact_id, c'est-à-dire 99 dans notre cas.
*/
c.phoneNumbers
(
).load
(
);
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 HasMany Associations in ExtJSRules for HasMany Associations in ExtJS.
Je remercie également FirePrawn pour sa relecture rapide.