2017-05-30 1 views
1

J'essaie d'implémenter une grille de révision générale comme this example, avec la différence que je voudrais synchroniser les changements avec le backend du serveur. Jusqu'à présent, je peux ajouter une nouvelle ligne avec onRoweditAdd.rowedit grid with sync

Ext.define('Mb.view.base.RoweditListController', { 
    extend: 'Ext.app.ViewController', 
    alias: 'controller.roweditlist', 
    onRoweditAdd: function(me){ 
     var grid = me.up('panel'), 
      edit = grid.editingPlugin, 
      store = grid.getStore(), 
      record = store.getModel().create({id: 0}); 
     edit.cancelEdit() 
     store.insert(0, record) 
     edit.startEdit(record, 0) 
    }, 
    editRowedit: function(editor, ctx) { 
     var store = ctx.grid.getStore(); 
     store.sync() 
    } 
}) 

Le problème est que store.sync() ne pas envoyer une demande create au serveur, mais une demande update. Il semble que store.insert(0, record) n'est pas comptabilisé. Seule la modification effectuée par l'utilisateur est synchronisée. Quel pourrait être le coupable?

+0

J'ai essayé de reproduire, cependant, [dans mon cas, que l'on appelle Créer, jamais mise à jour. Bizarre.] (Https://fiddle.sencha.com/#view/editor&fiddle/20j3) – Alexander

+0

Même si j'ai essayé et que je ne suis pas capable de le reproduire, s'il vous plaît partagez le violon si possible. –

+0

@Alexander J'ai trouvé une solution de contournement, regardez ma réponse. Si vous comprenez pourquoi créer un enregistrement avec l'ID 0 n'est pas autorisé, mettez-le comme réponse, je l'accepterai. –

Répondre

4

En donnant un id existant dans un enregistrement, ExtJS suppose que cet enregistrement existe déjà dans votre magasin et doit être mis à jour. Si vous ne donnez pas un identifiant alors il suppose qu'il s'agit d'un enregistrement nouvellement créé et qu'il ira créer la route. Cela vient de l'hypothèse que vous utilisez une stratégie d'ID générée (ce que vous devriez généralement faire) et que vous ne fournissiez donc jamais d'ID lors de la création. Sous le capot, ExtJS marque l'enregistrement comme fantôme: vrai ou faux.

Les enregistrements fantômes sont ceux qui existent uniquement dans le frontal et qui n'ont pas encore été conservés. Création d'un enregistrement sans id marquera comme fantôme alors que la création d'un disque avec un identifiant déjà fourni ne marquera pas comme fantôme et ne déclenchera pas créer appel, mais une mise à jour à la place

+0

Merci pour votre explication. C'est une différence avec ExtJs 4, où 'id == 0' signifiait * nouvel enregistrement * –

1

Malheureusement, je n'étais pas capable de créer un violon qui reproduit le problème.

Je l'ai résolu en changeant cette ligne:

record = store.getModel().create({id: 0}); 

à

record = store.getModel().create({}); 

Le problème doit faire quelque chose avec la nouvelle mise en œuvre des ids record depuis ExtJs 5. Mais je ne peux pas l'expliquer ...

La création d'un nouvel enregistrement avec id: 0 ne doit plus être prise en charge dans ExtJs 6.

1

J'ai trouvé que dans Ext.data.ModelidProperty est utilisé comme clé unique pour identifier l'enregistrement. Par défaut, il a un champ id. Si vous le fournissez en double, cela provoquera un problème dans store.

Cette description a écrit dans ExtJS doc

The data values for this field must be unique or there will be id value collisions in the Ext.data.Store. 
Defaults to: 
'id' 

S'il vous plaît se référer link