2013-05-14 3 views
8

Ich habe hier eine Geige gelegt, die das Problem demonstriert.Warum führt das KendoUI Grid beim Löschen der Funktion options.error kein Löschen durch?

http://jsfiddle.net/codeowl/fmzay/1/

Löschen Sie einfach einen Datensatz, und es sollte das löschen Rollback als ich options.error aus dem Inneren der Funktion zerstören nenne.

Warum wird das Raster nicht zurückgerollt?

Grüße,

Scott

Markup:

<div id="KendoGrid"></div> 

JS:

var _data = [ 
     { Users_ID: 1, Users_FullName: 'Bob Smith', Users_Role: 'Administrator' }, 
     { Users_ID: 2, Users_FullName: 'Barry Baker', Users_Role: 'Viewer' }, 
     { Users_ID: 3, Users_FullName: 'Bill Cow', Users_Role: 'Editor' }, 
     { Users_ID: 4, Users_FullName: 'Boris Brick', Users_Role: 'Administrator' } 
    ], 
    _dataSource = new kendo.data.DataSource({ 
     data: _data, 
     destroy: function (options) { 
      options.error(new Error('Error Deleting User')); 
     } 
    }); 

$('#KendoGrid').kendoGrid({ 
    dataSource: _dataSource, 
    columns: [ 
     { field: "Users_FullName", title: "Full Name" }, 
     { field: "Users_Role", title: "Role", width: "130px" }, 
     { command: ["edit", "destroy"], title: "&nbsp;", width: "180px" } 
    ], 
    toolbar: ['create'], 
    editable: 'popup' 
}); 
+0

Sind Sie sicher, dass Ihre Funktion 'destroy' aufgerufen wird? – OnaBai

+0

Guter Anruf. Ok ich habe es überarbeitet, und jetzt wird es aufgerufen. Aber immer noch das gleiche Verhalten, kein Rollback, und auch, wenn Sie mehr als einen Datensatz löschen, wird die Zerstörung Ereignis zu viele Male ausgelöst ... http://jsfiddle.net/codeowl/fmzay/2/ – user2109254

Antwort

17

Fehlersignalisierung ist nicht genug. Nehmen wir an, dass ein Fehler beim Entfernen eines Datensatzes nicht ausreicht, da KendoUI nicht weiß, ob der Datensatz tatsächlich auf dem Server entfernt wurde und die Antwort den Fehler erzeugt. So ist KendoUI Ansatz ein konservativer Ansatz: Sie müssen entscheiden, was zu tun ist und es ausdrücklich sagen:

Also, was Sie tun sollten, ist fügen Sie eine error Hander Funktion, die eine cancelChanges im Netz aufruft.

Der Code wäre:

_dataSource = new kendo.data.DataSource({ 
    transport: { 
     read: function(options) { 
      options.success(_data); 
      console.log('Read Event Has Been Raised'); 
     }, 
     destroy: function (options) { 
      options.error(new Error('Error Deleting User')); 
      console.log('Destroy Event Has Been Raised'); 
     } 
    }, 
    schema: { 
     model: { 
      id: "Users_ID", 
      fields: { 
       Users_ID: { editable: false, nullable: true }, 
       Users_FullName: { type: "string", validation: { required: true } }, 
       Users_Role: { type: "string", validation: { required: true } } 
      } 
     } 
    }, 
    error: function(a) { 
     $('#KendoGrid').data("kendoGrid").cancelChanges(); 
    } 
}); 

und die aktualisierte JSFiddle hier: http://jsfiddle.net/OnaBai/fmzay/3

+0

Fantastische Kumpel. Nun, wie kommt es, dass das Destroy-Event so oft ausgelöst wird ... Jedes Mal, wenn ich den Delete-Button drücke, wird es noch einmal ausgelöst. Schau dir die Konsole an, um zu sehen, was ich meine: http://jsfiddle.net/codeowl/fmzay/5/ – user2109254

+0

Das war eigentlich ein Bug in dieser Version. Wenn du das letzte Mal nachprüfst, wirst du sehen, dass es funktioniert. Http://jsfiddle.net/OnaBai/fmzay/6/ – OnaBai

+0

Ahhh, ja, ich muss das von einer alten Geige gegabelt haben, um damit zu beginnen. Das ist großartig. Nochmals vielen Dank für die Unterstützung. Sehr geschätzt !! – user2109254

2

Die ASP.NET-MVC gleichwertige Lösung der OnaBai Antwort wäre:

<script type="text/javascript"> 
function cancelChanges(e) { 
    e.sender.cancelChanges(); 
} 
</script> 

@Html.Kendo().Grid<MyClass>() 
.DataSource(dataSource => 
    dataSource 
    .Ajax() 
    .Read(read => read.Action("Read", "MyController")) 
    .Destroy(destroy => destroy.Action("Destroy", "MyController")) 
    .Events(evt => evt.Error("cancelChanges")) 
) 
[...] 

Bitte beachten Sie, dass das Ereignis cancelChange bei jedem CRUD-Request auf einen Fehler hin aufgerufen wird.

+1

Schön. Es ist besser, "e.sender" zu verwenden, als einen Verweis auf das Raster zu erhalten, indem jQuery wie in der akzeptierten Antwort verwendet wird. –

+1

@AugustoBarreto: 'e.sender' würde sich auf die dataSource beziehen, nicht auf das Raster. Das Raster wäre 'e.sender.options.table.parent ('div') [0]' was nicht viel besser aussieht;) – mrmashal

+0

@mrmashal Right. Vielen Dank! –