Extjs - Supprime du magasin l'élément sélectionné nouvellement ajouté
-
06-07-2019 - |
Question
Je dois supprimer un élément sélectionné dans un éditeur de grille. Tout d’abord, le magasin est chargé et l’utilisateur peut choisir d’ajouter ou de supprimer des lignes vierges à cette grille qu’il pourra ensuite éditer. Le problème ne concerne pas la suppression des enregistrements initiaux chargés du magasin. Le problème survient lorsque j'ajoute une ligne supplémentaire, la modifie, puis décide de la supprimer (l'utilisateur peut décider qu'il n'a pas besoin de cette ligne, après tout).
Il semble que lorsque je souhaite enregistrer les modifications à l'aide de store.getModifiedRecords, il voit toujours la ligne qui a été supprimée et la traite également. Voici le bouton supprimer:
442
443 text:'Remove',
444 tooltip:'Remove attribute',
445 iconCls:'silk-table_delete',
446 handler: function() {
447 var selectedItem = attributeEditor.getSelectionModel().getSelected();
448
449 // Check if we have selected item
450 if (selectedItem) {
451 // Get selected item value
452 var attribute = selectedItem.get('Name');
453
454 // Remove selected
455 attributeStore.remove(selectedItem);
456
457 // Add to our removed attributes hash
458 if (id) {
459 RemovedAttributes.push(attribute);
460 }
461 } else {
462 wispUserFormWindow.getEl().mask();
463
464 // Display error
465 Ext.Msg.show({
466 title: "Nothing selected",
467 msg: "No attribute selected",
468 icon: Ext.MessageBox.ERROR,
469 buttons: Ext.Msg.CANCEL,
470 modal: false,
471 fn: function() {
472 wispUserFormWindow.getEl().unmask();
473 }
474 });
475 }
476 }
477 }
La solution
C’est ainsi que fonctionne store.getModifiedRecords (). Les enregistrements d'enregistrements modifiés sont stockés dans un tableau appelé objet modifié en magasin. Lorsque vous supprimez un élément du magasin, il n'est pas supprimé par défaut.
Voici le remove () réel du magasin
remove : function(record){
var index = this.data.indexOf(record);
this.data.removeAt(index);
if(this.pruneModifiedRecords){
this.modified.remove(record);
}
if(this.snapshot){
this.snapshot.remove(record);
}
this.fireEvent("remove", this, record, index);
}
Cela signifie que l'élément est supprimé de la liste modifiée uniquement si vous spécifiez la valeur de l'option pruneModifiedRecords sur true. Cette valeur est false par défaut, comme indiqué dans l'API de magasin.
Si vous souhaitez que l'élément nouvellement ajouté soit supprimé de la liste modifiée, vous devez définir la valeur de pruneModifiedRecords sur true lors de la création du magasin. Ex:
var stote = new Ext.data.SimpleStore({
fields: [],
data: [],
pruneModifiedRecords: true
})
Autres conseils
store.load();
//remove function will delete specific record.
store.remove(store.findRecord("item_id","1"));
store.sync();
Je pense que le lien suivant peut vous aider de manière simple à gérer un magasin
De mémoire, je ne vois pas pourquoi votre code fonctionnerait de cette façon, car il semble être correct. Avez-vous utilisé Firebug pour définir un point d'arrêt et suivre le processus?