2014-07-16 1 views
1

Cette question a été posée deux fois auparavant dans le SO:mise en œuvre de nombreux à de nombreuses associations dans ExtJS 4

Mais aucune de ces questions ont une réponse réelle , donc je vais essayer encore! Disons que j'ai deux modèles, User et Group. Un utilisateur peut appartenir à plusieurs groupes et les groupes peuvent contenir plusieurs utilisateurs. Voici le code de modèle pour User:

Ext.define('User', { 
    extend: 'Ext.data.Model', 
    alias: 'model.User', 
    fields: [ 
     {name: 'username', type: 'string'}, 
     ... 
    ], 
    proxy: { 
     // Omitted for brevity... 
    }, 
}); 

Et Group:

Ext.define('Group', { 
    extend: 'Ext.data.Model', 
    alias: 'model.Group', 
    fields: [ 
     {name: 'name', type: 'string'}, 
     ... 
    ], 
    proxy: { 
     // Omitted for brevity... 
    }, 
}); 

Maintenant, disons que je voulais une grille qui énumère mes groupes, et me permet de double-cliquez sur un groupe et modifier les utilisateurs sont dans ce groupe dans la deuxième grille. Disons aussi qu'il y a beaucoup d'utilisateurs par groupe, donc je ne veux pas charger tous les les utilisateurs associés lorsque je charge les groupes. Je veux pouvoir obtenir un magasin d'utilisateurs pour un groupe particulier, et le donner à ma grille, qui chargera les données selon les besoins (en utilisant la pagination habituelle que fait une grille).

Je vois deux approches potentielles ici. Il y a peut-être un autre meilleur moyen, mais je vais décrire ce que j'ai essayé de faire ci-dessous.

Modèle intermédiaire

  • Ajouter un autre modèle de rejoindre
  • Ajouter hasMany associations de User et Group à ce modèle
  • Ajouter belongsTo associations de mon modèle de rejoindre de nouveau la voie à User et Group.

Rejoindre Code modèle:

Ext.define('GroupUsers', { 
    extend: 'Ext.data.Model', 
    alias: 'model.GroupUsers', 
    fields: [ 
     {name: 'group_id', type: 'int'}, 
     {name: 'user_id', type: 'int'}, 
    ], 
    associations: [ 
     {type: 'belongsTo', model: 'User'}, 
     {type: 'belongsTo', model: 'Group'} 
    ], 
    ... 
}); 

Association Group:

associations: [ 
    {type: 'hasMany', model: 'GroupUsers', name: 'group_users'} 
], 

Je vais maintenant être en mesure d'accéder à une boutique de GroupUsers pour un Group particulier:

group.group_users() 

Le problème avec cette approche, c'est que je ne peux pas simplement lier un magasin de GroupUsers à ma deuxième grille, parce que je veux afficher des choses comme le nom de l'utilisateur. Je pourrais itérer les articles du magasin, récupérer chaque objet User avec getUser(), les ajouter à un autre magasin, et l'utiliser pour ma grille, mais cela entraîne une demande de serveur par article!Alternativement, je pourrais utiliser mon magasin de GroupUsers directement, mais alors aurait besoin de faire quelque chose avec des moteurs de rendu et j'ai encore besoin d'aller chercher chaque User individuellement.

association directe

  • associé User et Group directement avec une association hasMany sur chaque

associations sur Group:

associations: [ 
    {type: 'hasMany', model: 'User', name: 'users', foreignKey: '???'} 
], 

Je peux maintenant obtenir un magasin de réelle User objets pour un groupe donné:

group.users() 

Ce qui serait génial, sauf qu'il n'y a rien pour moi pour définir le foreignKey de l'association. User ne peut pas avoir un champ group_id, car un User peut avoir plusieurs Group s!

+0

La façon dont je le vois, supposons que nous avons l'information de magasin avec la structure GroupId, GroupName, UserId, UserName (un magasin combiné ayant tous les enregistrements récupérés en utilisant join). Supposons que nous ayons une grille pour afficher les enregistrements groupés par GroupId et afficher une liste de groupes, une fois développée, elle affiche la liste des utilisateurs de ce groupe. Maintenant, supposons qu'un clic sur un bouton réorganise le magasin et met à jour l'affichage de la grille pour afficher une liste d'utilisateurs, une fois développée, elle affiche la liste des groupes auxquels appartient l'utilisateur. La logique totale derrière ceci peut être implémentée avec la fonction de filtrage filterBy et de groupement du magasin –

+0

@MohammadAftabUddin merci pour votre suggestion, mais il ne répond pas vraiment à la question, j'ai dit que je ne veux pas charger toutes les données à l'avance. –

+0

Ce n'est probablement pas une solution pour vous, mais juste pour l'enregistrement, [ManyToMany] (http://docs.sencha.com/extjs/5.0.0/apidocs/#!/api/Ext.data.schema.ManyToMany) les associations sont soutenues dans ExtJS 5. – matt

Répondre

3

Peut-être que ce n'est pas la réponse que vous cherchez, mais comment je résoudre ce problème:

Je ne le lien entre les groupes et les utilisateurs avec les associations de magasins de ExtJS, mais plutôt du côté du serveur.

Dans le contrôleur de votre grille mettre quelque chose comme ceci:

init: function(){ 
    this.control({ 
     'grid': {itemdblclick: this.onGridItemdblclick} 
    }) 
}, 
onGridItemdblclick: function(grid, record){ 
    var group_id = record.getId(), 
    usersStore = this.getStore('Users'); 
    usersStore.load({params: {group_id: group_id}}); 
    var win = Ext.widget('UsersGrid'); // adapt the code to your naming scheme 
    win.show(); 
} 

La demande de charger le magasin Users sera envoyé avec un paramètre supplémentaire group_id. Côté serveur, vous pouvez utiliser ce paramètre supplémentaire pour filtrer vos utilisateurs.

Questions connexes