2013-06-10 4 views
5

Mit Kendo Grid Batch-Bearbeitung eingeschaltet, weiß ich, dass Sie in die create, update und zerstören Befehle wo Kendo wird 3 separate Befehle an den Server senden, wenn Sie auf klicken Änderungen speichern.Kendo Grid Batch-Bearbeitung - Einen einzigen Anruf tätigen, um zu speichern

Ich frage mich, ob es eine Möglichkeit gab, alle drei Sätze von Updates als ein einziger Anruf an den Server zu senden - wie eine Transaktion. Oder senden Sie jedes in einer bestimmten Reihenfolge, mit einem Scheck für den Erfolg vor dem Senden der nächsten.

Die einzige Möglichkeit, die ich mir vorstellen konnte, war eine benutzerdefinierte Save Changes-Implementierung, die beim Aufrufen der Rasterdatenquelle nach allen Zeilen suchte, die hinzugefügt wurden (isNew() für hinzugefügte Zeilen), gelöscht (_destroyed für gelöschte Zeilen), aktualisiert (isDirty für aktualisierte Zeilen) und dann meinen eigenen Aufruf an einen Server-Endpunkt mit Ajax unter Verwendung der identifizierten Datensätze erstellen.

gesetzt Wenn true die Datenquelle Anfragen werden Batch CRUD Betrieb:

Antwort

1

Vielleicht können Sie die batch Eigenschaft des Datasource

Batch Boolean (false default) aktivieren. Beispielsweise würde das Aktualisieren von zwei Datenelementen eine HTTP-Anforderung anstelle von zwei verursachen. Standardmäßig erstellt die Datenquelle für jede CRUD-Operation eine HTTP-Anforderung.

Quelle: Datasource API

+1

Dank @Romain. Das habe ich mit Batch-Bearbeitung gemeint. Ich habe Batch: True Set auf meiner Datenquelle. Kendo sendet eine HTTP-Anfrage für eine Reihe von aktualisierten Zeilen, eine separate HTTP-Anfrage für das Löschen mit allen Zeilen, die gelöscht wurden. Aber ich möchte eine HTTP-Anfrage für alle Updates erstellen und löschen. – Deepak

12

Telerik posted eine Behelfslösung in ihrem Code-Bibliothek vor kurzem: http://www.kendoui.com/code-library/mvc/grid/save-all-changes-with-one-request.aspx. Leider ist der Work-around eher leer. Es gibt ein gutes Beispiel dafür, wie man zerstörte, schmutzige und neue Aufzeichnungen aufnimmt, aber mit einer Handbewegung beendet wird, um Fehler in der Antwort zu behandeln und die Datenquelle auf Erfolg zu synchronisieren. Beachten Sie außerdem, dass vor dem Ausführen der Ajax-Anforderung keine Überprüfung durchgeführt wird, um sicherzustellen, dass zerstörte, beschädigte oder neue Datensätze vorhanden sind.

Hier ist der entsprechende Code. Laden Sie das vollständige Beispiel über den obigen Link herunter, um zu sehen, wie das Grid eingerichtet ist, und um sicherzustellen, dass Sie über die neueste Version verfügen.

function sendData() { 
    var grid = $("#Grid").data("kendoGrid"), 
     parameterMap = grid.dataSource.transport.parameterMap; 

    //get the new and the updated records 
    var currentData = grid.dataSource.data(); 
    var updatedRecords = []; 
    var newRecords = []; 

    for (var i = 0; i < currentData.length; i++) { 
     if (currentData[i].isNew()) { 
      //this record is new 
      newRecords.push(currentData[i].toJSON()); 
     } else if(currentData[i].dirty) {   
      updatedRecords.push(currentData[i].toJSON()); 
     } 
    } 

    //this records are deleted 
    var deletedRecords = []; 
    for (var i = 0; i < grid.dataSource._destroyed.length; i++) { 
     deletedRecords.push(grid.dataSource._destroyed[i].toJSON()); 
    } 

    var data = {}; 
    $.extend(data, parameterMap({ updated: updatedRecords }), parameterMap({ deleted: deletedRecords }), parameterMap({ new: newRecords })); 

    $.ajax({ 
     url: "/Home/UpdateCreateDelete", 
     data: data, 
     type: "POST", 
     error: function() { 
      //Handle the server errors using the approach from the previous example 
     }, 
     success: function() { 
      alert("update on server is completed"); 

      grid.dataSource._destroyed = []; 
      //refresh the grid - optional 
      grid.dataSource.read(); 
     } 
    }) 
}