ExtJS 4: grille: comment sélectionner un nouveau record?
Ma question est donc simple, il est dans le titre!
Voici mon code:
userCreate: function(button) {
var grid = button.up('panel'),
store = grid.getStore();
/* Create new empty record */
var inst = store.add({})[0];
store.sync();
/* select the newly created record */
grid.getSelectionModel().select(inst.id);
Ext.create('GS.view.user.Edit', { create:true });
},
Maintenant, je veux juste la ligne après le
/* select the newly created record */
de travailler!
J'ai essayé beaucoup de choses, mais aucune de ces travaux:
grid.getSelectionModel().select(inst.id);
grid.getSelectionModel().select(inst);
grid.getSelectionModel().select(store.last);
Une idée?
Merci beaucoup
Je pense qu'il va avoir quelque chose à voir avec le fantôme de drapeau sur le dossier.
J'ai mis à jour ma question merci pour votre commentaire. Merci 😉
J'ai mis à jour ma question merci pour votre commentaire. Merci 😉
OriginalL'auteur Olivier Pons | 2011-08-02
Vous devez vous connecter pour publier un commentaire.
comme quoi @Tom a dit...
utiliser la grille pour sélectionner votre nouveau disque, althougt
vous pouvez toujours sélectionner votre nouvel enregistrement par sélection de modèle...
de docs.. sélectionnez la méthode de besoin de 3 paramètre à passer..
donc dans votre cas :
grid.getView().select()
a le droit d'appeler à faire (celui d'avant qui est inutile). Mais maintenant, le problème vient destore.sync()
: si j'appellestore.synch()
le système ne peut pas trouver l'enregistrement (il semble que ce genre de "perd"). Je suis de plus près, mais pas assez près. Et je besoin pour appelerstore.synch()
parce que le serveur renvoie les valeurs par défaut, et je ne veux pas les valeurs par défaut pour être codées en dur dans mon code JavaScript. Une idée de comment faire cela?pourriez-vous mettre à jour votre question avec votre code actuel ou de l'utilisation jsfiddle.net? cause, quand j'ai essayé la fonction avec ma grille fictive (pas de serveur d'interaction).. il fonctionne encore
Grâce Warung... vous avez sauvé ma journée 🙂
OriginalL'auteur Egy Mohammad Erdin
Voici ce que j'ai trouvé: ExtJS semble être perdu quand il n'y a pas de champ "id".
Ainsi, après un appel à
sync()
si vous n'avez pas précise un champ "id", il kindof ré-organiser la grille et ne peut pas trouver le "vieux" record " (celui que je me suis souvenu juste avant l'appel).C'est juste ce que je pense, j'ai peut-être tort.
De toute façon, j'ai fait une rotation: pour rester "homogeneonous", je vais faire
xxxCreate()
, etxxxCreateValidate()
, même pourxxxUpdate()
etxxxUpdateValidate()
. Je l'ai fait pour l'exemple: utilisateur =>userCreate()
,userCreateValidate()
,userUpdate()
etuserUpdateValidate()
:J'espère que mon code va aider quelqu'un... maintenant, je suis à la recherche d'un moyen de gérer les clés de la Grille. Et comme tout avec ExtJS: vous ne passez pas votre temps à coder, parce que tout est déjà fait, vous passez votre temps recherche... c'est plus frustrant en fait =)
De toute façon, la chose la plus importante à noter est que l'enregistrement nouvellement ajouté est pas sélectionné. C'est juste une solution pour continuer à se développer, mais ce n'est pas ce que je voulais (ce n'est pas exactement ce que je demande dans la question).
La solution est une solution de contournement, de pas utiliser ce que je demande, c'est à dire éviter de choisir un nouveau record, et il suffit de créer. Peut-être une solution de contournement n'est pas une bonne réponse. Si oui, je m'en excuse, et je vais retirer ma propre réponse. Voir la
userCreateValidate()
fonction qui appellesync()
mais n'a pas besoin de sélectionner le dossier, une fois qu'il a été créé.OriginalL'auteur Olivier Pons
Ligne de la grille de sélection est généralement traitée dans le point de Vue de l'objet (en ExtJS 3, il a GridView). Donc je pense que si vous mettez à jour votre code ci-dessus est:
de la grille.getView().sélectionnez(0);
Cela, sélectionnez la ligne à l'indice 0 qui ressemble à l'endroit où vous êtes en train d'ajouter le nouvel enregistrement. Le point de Vue de l'objet, puis en informer le modèle de sélection et de mise à jour de l'affichage du navigateur. Il existe d'autres options de sélection que vous pouvez trouver via l'API docs à http://docs.sencha.com/ext-js/4-0/#/api/Ext.grid.View-method-select
OriginalL'auteur Tom
Votre exemple fonctionne très bien quand
grid.getSelectionModel().select(inst);
est utilisé. Donc, la seule chose qui peut provoquer un tel comportement eststore.sync();
lancer une exception. Découvrez la sortie de la console d'erreurs.OriginalL'auteur Molecular Man
Je ne sais pas de toute possibilité de sélectionner directement ce dossier parce que avant de synchronisation, et que les dossiers est un fantôme enregistrement dans le magasin, mais pas après. Aussi, vous pouvez assigner un id sur le côté serveur(?) pour changer le dossier et il ne serait pas être la même après sync()...
Si certaines champ dans l'enregistrement doit être unique (par exemple, le nom ou la description ou quoi que ce soit), vous pouvez l'utiliser pour trouver cet enregistrement après la synchronisation et sélectionnez:
OriginalL'auteur Farish
Je pense que le problème ici est que vous essayez de sélectionner l'enregistrement directement après l'appel de
store.sync();
mais c'est en fait asynchrone demande que les mises à jour de magasin après il récupère les données à partir du serveur.Essayez d'appeler
grid.getSelectionModel().select
après votre boutique est mise à jour à partir du serveur. Le problème avec cette approche est questore.sync
ne prend pas en charge toute méthode de rappel, mais vous devriez être capable d'utiliserdatachanged
événements de votre magasin, qui devrait être congédié après le magasin de synchronisation est effectuée.Essayer quelque chose comme cela (sur base de l'exemple de code que vous avez fournie):
OriginalL'auteur sbgoran
vous pouvez utiliser simplement comme ceci:
OriginalL'auteur Amin