2017-05-01 4 views
0

ExtJs nicht die gleiche Antwort vom Server erwartet Zeilen als ExtJs zur Bestätigung der Aktualisierung 4.ExtJs 6 - Änderung Update in Ajax-Anfragen

ich eine Tabelle mit einer String-ID habe:

Ext.define('App.Product', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'productid', type: 'string'}, 
     {name: 'ord', , type: 'int'}, 
     (...) 
    ], 
    idProperty: 'nrproduit' 
}) 

Upon die Änderungen zu speichern, sendet der Client ExtJs die geänderten Daten an den Server:

[{"ord":1,"productid":"SG30301"},{"ord":3,"productid":"SG30100"}] 

In ExtJs 4.2, den Server erwartet die vollständigen Daten der beiden Produkte zurück, wie diese zu senden:

{ 
    "success":true, 
    "data":[{ 
     "nrproduit":"SG30100", 
     "ord":3, 
     "author":"...", 
     "editor":"...", 
     (...) 
    },{ 
     "nrproduit":"SG30301", 
     "ord":3, 
     "author":"...", 
     "editor":"...", 
     (...) 
    }] 
} 

In ExtJs 6.2 funktioniert das nicht mehr. Ich erhalte die Fehler

Uncaught Error: Duplicate newKey "SG30100" for item with oldKey "SG30301"

Offenbar hat der Kunde nicht berücksichtigt die idProperty, scheint aber die Reihenfolge der Reihe zu erwarten, dass die gleichen in der Antwort, wie in der Anfrage zu sein.

Gibt es eine Möglichkeit, den Client zu zwingen, die vom Server zurückgesendeten IDs zu berücksichtigen? Oder muss der Servercode geändert werden? Gibt es eine Dokumentation darüber, was genau zwischen ExtJs 4.2 und 6.2 in Bezug auf die Datensynchronisation zwischen Client und Server geändert wurde, die in diese Details eingehen?

Antwort

1

ExtJS berücksichtigt die Reihenfolge, weil sich IDs ändern können, z. während Einfügeoperationen (wenn die ID serverseitig generiert wird). Um dies zu berücksichtigen, erwartet ExtJS im Allgemeinen, die Ergebnisse vom Server in der Reihenfolge zu erhalten, in der die Datensätze gesendet wurden.

Es gibt jedoch mehr. Unter bestimmten Umständen verwendet es die ID, nicht die Reihenfolge. Sie können Operation.doProcess lesen, um herauszufinden, wie ExtJS das tut, was es tut, und es möglicherweise überschreiben, wenn Sie ein anderes Verhalten benötigen.

Edit: Es verwendet die ID, wenn das Modell die Eigenschaft clientIdProperty hat, sonst verwendet es die Reihenfolge. So ist es genug, um es so hinzuzufügen:

Ext.define('App.Product', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'productid', type: 'string'}, 
     {name: 'ord', , type: 'int'}, 
     (...) 
    ], 
    idProperty: 'nrproduit', 
    clientIdProperty: 'nrproduit' 
}) 
+0

Dieser Code im Grunde wieder in: wenn der Datensatz ein 'clientIdProperty' hat, identifiziert er die zurückgegebenen Datensätze, sonst ist es der Auftrag, der die Korrespondenz erstellt. –

+0

Ein wichtiger Punkt: In ExtJs werden 'update' und' create' standardmäßig übernommen, wenn der Server keine Daten sendet. Wenn ich mich richtig erinnere (und richtig interpretiere http://docs.sencha.com/extjs/4.2.2/source/Operation.html#Ext-data-Operation-method-commitRecords, in ExtJs 4.2 musste der Server zurücksenden die Aufzeichnungsdaten. –