Extjs: rimuove l'elemento selezionato appena aggiunto dal negozio
-
06-07-2019 - |
Domanda
Devo rimuovere un elemento selezionato in un editorgrid. Innanzitutto viene caricato l'archivio e l'utente può scegliere di aggiungere o eliminare righe vuote in questa griglia che possono quindi modificare. Il problema non riguarda la rimozione dei record iniziali caricati dall'archivio. Il problema si presenta quando aggiungo una riga aggiuntiva, la modifico e quindi scelgo di rimuoverla (l'utente può decidere di non aver bisogno di questa riga dopo tutto).
Sembra che quando vorrei salvare le modifiche usando store.getModifiedRecords, vede ancora la riga che è stata eliminata e quindi la elabora. Ecco il pulsante di rimozione:
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 }
Soluzione
Ecco come funziona store.getModifiedRecords (). I record dei record modificati sono memorizzati in un array chiamato modificato nell'oggetto store. Quando rimuovi un articolo dal negozio, questo non viene rimosso per impostazione predefinita.
Ecco l'attuale remove () dallo store
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);
}
Ciò significa che l'elemento viene rimosso dall'elenco modificato solo se si specifica il valore dell'opzione pruneModifiedRecords su true. Questo valore è falso per impostazione predefinita, come indicato nell'API Store.
Se si desidera che l'elemento appena aggiunto venga rimosso dall'elenco modificato, è necessario impostare il valore di pruneModifiedRecords su true durante la creazione del negozio Es .:
var stote = new Ext.data.SimpleStore({
fields: [],
data: [],
pruneModifiedRecords: true
})
Altri suggerimenti
store.load();
//remove function will delete specific record.
store.remove(store.findRecord("item_id","1"));
store.sync();
Penso che il seguente link possa aiutarti in modo semplice come gestire il negozio
In cima alla mia testa, non riesco a capire perché il tuo codice funzioni in questo modo, poiché sembra essere corretto. Hai usato Firebug per impostare un breakpoint ed eseguire il processo?