2013-05-14 60 views
8

我在這裏提出了一個演示這個問題的小提琴。爲什麼在調用options.error函數時KendoUI網格不能回滾刪除?

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

只要刪除的記錄,它應該回滾刪除,因爲我打電話從破壞函數內部options.error。

爲什麼電網不回滾?

問候,

斯科特

標記:

<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'函數被調用嗎? – OnaBai 2013-05-14 09:06:50

+0

好的呼叫。好的,我修改了它,現在它被調用。但仍然是相同的行爲,沒有回滾,並且如果刪除多條記錄,則銷燬事件get的次數會提高太多次... http://jsfiddle.net/codeowl/fmzay/2/ – user2109254 2013-05-14 11:55:18

回答

17

信令錯誤是不夠的。可以說,刪除記錄時出錯是不夠的,因爲KendoUI不知道記錄是否已經在服務器中被刪除,並且回覆是產生錯誤的那個。所以KendoUI的方法是一種保守的方法:你必須決定做什麼,並明確地說:

所以你應該做的是添加一個error hander函數,在網格中調用cancelChanges

的代碼將是:

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

和更新後的jsfiddle在這裏:http://jsfiddle.net/OnaBai/fmzay/3

+0

夢幻般的伴侶。現在,如何讓Destroy事件多次提升......每次按下Delete按鈕時,它都會再次被提升。看看控制檯,看看我的意思: http://jsfiddle.net/codeowl/fmzay/5/ – user2109254 2013-05-14 12:24:15

+0

這實際上是該版本的錯誤。如果你檢查最新,你會看到它的作品http://jsfiddle.net/OnaBai/fmzay/6/ – OnaBai 2013-05-14 12:44:00

+0

啊,是的,我必須從一個老小提琴叉開始。太棒了。再次感謝您的支持。非常感激!! – user2109254 2013-05-14 22:35:45

2

的ASP.NET MVC的等價解決OnaBai的答案是:

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

請注意,當每個CRUD請求發生錯誤時,將調用cancelChanges事件。

+1

不錯。使用「e.sender」比使用jQuery獲得對網格的引用更好,就像在接受的答案中一樣。 – 2015-12-02 15:15:22

+1

@AugustoBarreto:'e.sender'會引用數據源,而不是網格。該網格將在'e.sender.options.table.parent('div')[0]'這看起來好多了) – mrmashal 2016-02-16 08:56:51

+0

@mrmashal對。謝謝! – 2016-02-16 22:27:03

相關問題