2013-05-14 34 views
8

Tôi đã đặt một câu đố ở đây thể hiện vấn đề.Tại sao Lưới KendoUI không phục hồi lại khi chức năng options.error được gọi?

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

Chỉ cần xóa một kỷ lục, và nó nên rollback xóa như tôi gọi options.error từ bên trong phá hủy chức năng.

Tại sao lưới không quay trở lại?

Kính trọng,

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

Bạn có chắc chắn rằng chức năng 'phá hủy' của bạn đang được gọi? – OnaBai

+0

Cuộc gọi tốt. Ok tôi đã sửa đổi nó, và bây giờ nó được gọi. Nhưng vẫn còn hành vi tương tự, không có rollback, và cũng có thể nếu bạn xóa nhiều hơn một kỷ lục, sự kiện tiêu diệt được nâng lên quá nhiều lần ... http://jsfiddle.net/codeowl/fmzay/2/ – user2109254

Trả lời

17

tín hiệu lỗi là không đủ. Cho phép nói rằng có một lỗi về loại bỏ một kỷ lục là không đủ kể từ KendoUI không biết nếu hồ sơ đã thực sự được gỡ bỏ trong máy chủ và trả lời là một trong những sản xuất lỗi. Vì vậy, cách tiếp cận KendoUI là một cách tiếp cận bảo thủ: Bạn phải quyết định phải làm gì và nói rõ ràng:

Vì vậy, những gì bạn cần làm là thêm một hàm hander error gọi số cancelChanges trong lưới.

Mã này sẽ là:

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

Và JSFiddle được cập nhật tại đây: http://jsfiddle.net/OnaBai/fmzay/3

+0

Fantastic mate. Bây giờ làm thế nào đến sự kiện Destroy được nâng lên rất nhiều lần ... Mỗi khi tôi nhấn nút Delete, nó được nâng lên một lần nữa. Hãy xem bảng điều khiển để xem ý tôi là: http://jsfiddle.net/codeowl/fmzay/5/ – user2109254

+0

Đó thực sự là lỗi trên bản phát hành đó. Nếu bạn kiểm tra với mới nhất, bạn sẽ thấy rằng nó hoạt động http://jsfiddle.net/OnaBai/fmzay/6/ – OnaBai

+0

Ahhh, vâng tôi phải có phân chia này từ một fiddle cũ để bắt đầu với. Cái đó thật tuyệt. Một lần nữa cảm ơn bạn đã hỗ trợ. Nhiều đánh giá cao!! – user2109254

2

Các giải pháp tương đương ASP.NET MVC-câu trả lời OnaBai sẽ là:

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

Xin lưu ý rằng sự kiện hủyChange sẽ được gọi khi có lỗi trên mọi yêu cầu CRUD.

+1

Rất đẹp. Tốt hơn là sử dụng "e.sender" hơn là tham chiếu đến lưới bằng cách sử dụng jquery như trong câu trả lời được chấp nhận. –

+1

@AugustoBarreto: 'e.sender' sẽ tham chiếu đến dataSource, không phải là lưới. Lưới sẽ nằm ở 'e.sender.options.table.parent ('div') [0]' trông không tốt hơn nhiều;) – mrmashal

+0

@mrmashal Right. Cảm ơn! –

Các vấn đề liên quan