2013-05-14 20 views
8

Ho messo qui un violino che dimostra il problema.Perché la griglia KendoUI non esegue il rollback di un'eliminazione quando viene chiamata la funzione options.error?

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

Basta eliminare un record, e dovrebbe far ritirare la cancellazione come mi chiamo options.error dall'interno della funzione di distruggere.

Perché la griglia non viene ripristinata?

saluti,

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

Sei sicuro che la funzione 'destroy' viene chiamata? – OnaBai

+0

Buona chiamata. Ok, l'ho rivisto e ora viene chiamato. Ma sempre lo stesso comportamento, nessun rollback, e anche se si elimina più di un record, l'evento destroy viene generato troppe volte ... http://jsfiddle.net/codeowl/fmzay/2/ – user2109254

risposta

17

segnalazione l'errore non è sufficiente. Diciamo che avere un errore nella rimozione di un record non è sufficiente dato che KendoUI non sa se il record è stato effettivamente rimosso nel server e la risposta è quella che produce l'errore. Quindi l'approccio KendoUI è un approccio conservativo: devi decidere cosa fare e dirlo esplicitamente:

Quindi, ciò che dovresti fare è aggiungere una funzione di hander error che richiami uno cancelChanges nella griglia.

Il codice sarebbe:

_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(); 
    } 
}); 

E l'aggiornamento JSFiddle qui: http://jsfiddle.net/OnaBai/fmzay/3

+0

Compagno fantastico. Ora come mai l'evento Destroy viene sollevato così tante volte ... Ogni volta che premo il pulsante Elimina, viene sollevato ancora una volta. Dai un'occhiata alla console per vedere cosa intendo: http://jsfiddle.net/codeowl/fmzay/5/ – user2109254

+0

Questo era in realtà un bug su quella versione. Se controlli l'ultima volta, vedrai che funziona http://jsfiddle.net/OnaBai/fmzay/6/ – OnaBai

+0

Ahhh, sì, devo averlo biforcato da un vecchio violino per cominciare. È grandioso. Ancora una volta grazie per il supporto. Molto apprezzato!! – user2109254

2

La soluzione equivalente ASP.NET MVC-alla risposta OnaBai sarebbe:

<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")) 
) 
[...] 

Si prega di notare che l'evento cancelChanges verrà chiamato su un errore su ogni richiesta CRUD.

+1

Bello. È meglio usare "e.sender" piuttosto che ottenere un riferimento alla griglia usando jquery come nella risposta accettata. –

+1

@AugustoBarreto: 'e.sender' farebbe riferimento a dataSource, non alla griglia. La griglia si trova in 'e.sender.options.table.parent ('div') [0]' che non sembra molto meglio;) – mrmashal

+0

@mrmashal Right. Grazie! –

Problemi correlati