2013-05-14 25 views
8

Sorunu gösteren bir klavyeyi buraya koydum. KendoUI Grid, options.error işlevi çağrıldığında neden silme yapmıyor?

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

Sadece bir kaydı silmek, ve ben yok etmek işlevi içinden options.error arıyorum olarak silmek geri alma gerekir.

Kılavuz neden geri dönmüyor?

Selamlar,

Scott

Biçimlendirme:

<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

'Destroy' işlevinizin çağrıldığından emin misiniz? – OnaBai

+0

İyi çağrı. Tamam, revize ettim ve şimdi aradı. Ama yine de aynı davranış, geri dönüş yok ve aynı zamanda birden fazla kaydı silerseniz, destroy olayı pek çok kez büyütüldü ... http://jsfiddle.net/codeowl/fmzay/2/ – user2109254

cevap

17

hatası Sinyal yeterli değildir. KendoUI, sunucudaki kayıtların gerçekten kaldırılıp kaldırılmadığını ve cevabın hata üretip üretmediğini bilmediğinden, bir kaydı kaldırmada hata yapmanın yeterli olmadığını belirtelim. Yani KendoUI yaklaşımı muhafazakar bir yaklaşımdır: Ne yapılacağına ve açıkça söyleyeceğinize karar vermelisiniz:

Yapmanız gereken şey, bir cancelChanges ızgarada çağıran bir error hander işlevi eklemektir.

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

Ve burada güncelleme JSFiddle:

kod olurdu http://jsfiddle.net/OnaBai/fmzay/3

+0

Fantastik arkadaş. Şimdi Destroy olayı neden pek çok kez ortaya çıkıyor ... Sil düğmesine bastığımda her seferinde bir kez daha ortaya çıkıyor. Ne demek istediğimi görmek için konsola bir göz atın: http://jsfiddle.net/codeowl/fmzay/5/ – user2109254

+0

Bu sürümde aslında bir hataydı. En son olarak kontrol ederseniz, bunun işe yaradığını göreceksiniz. Http://jsfiddle.net/OnaBai/fmzay/6/ – OnaBai

+0

Ahhh, evet bunu baştan başlamak için eski bir kemandan atmalıyım. Bu harika. Bir kez daha destek için teşekkür ederim. Çok takdir! – user2109254

2

OnaBai cevap ASP.NET MVC-eşdeğer çözüm olacaktır:

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

Lütfen her CRUD isteğindeki bir hata üzerine cancelChanges etkinliğinin çağrılacağını unutmayın.

+1

Güzel. "E.sender" ı, kabul edilen cevapta olduğu gibi jQuery kullanarak ızgaraya referans almaktan daha iyidir. –

+1

@AugustoBarreto: "e.sender", dataSource'a değil, grid'e başvurur. Izgara, daha iyi görünmeyen e.sender.options.table.parent ('div') [0] adresinde olurdu;) – mrmashal

+0

@mrmashal Right. Teşekkürler! –