Tôi có bộ sưu tập ObservableArray
liên kết với bảng HTML với tùy chọn chỉnh sửa hàng loạt (MVC3), mỗi lần người dùng truy cập vào cam kết mà tôi muốn gửi các hàng đã sửa đổi từ bộ sưu tập thay vì gửi toàn bộ danh sách chế độ xem, hãy tư vấn nếu có cách tốt nhất để theo dõi hoặc chỉ lọc các hàng đã sửa đổi.Cách tốt nhất để chỉ nhận các hàng đã sửa đổi từ observableArray (khi có tùy chọn chỉnh sửa hàng loạt)
Trả lời
Đây là một post về việc tạo ra một lá cờ bẩn trong Knockout mà sẽ theo dõi những thay đổi cho tất cả các quan sát trong một đối tượng.
Thông thường, bạn sẽ thêm cờ bẩn vào mỗi mục trong mảng của bạn trong hàm dựng hoặc lặp qua từng mục và thêm cờ. Sau đó, bạn có thể tạo một tính toán có thể quan sát để chỉ đại diện cho các mục đã thay đổi để gửi lại cho máy chủ.
Đây là một mẫu cho thấy một lá cờ bẩn trên từng hạng mục và một quan sát được tính chỉ chứa các mục bẩn: http://jsfiddle.net/rniemeyer/wauwn/
Nó không phải là nhiệm vụ tầm thường như nó có thể như thế nào.
Lúc đầu, mảng quan sát chỉ xử lý việc sửa đổi mảng (chèn, xóa, sắp xếp lại, v.v.) không sửa đổi phần tử.
Thứ hai, bạn có thể cần cờ đặc biệt như 'isModified' trong mô hình của bạn liên kết với mỗi hàng trong bảng.
Sau đó, bạn cần đặt cờ đó nếu một số ràng buộc được cập nhật. Knockoutjs observables cung cấp phương thức đăng ký cho phép gọi hàm của riêng bạn khi các quan sát được cập nhật. Hãy xem trang http://knockoutjs.com/documentation/observables.html ở dưới cùng có một phần được gọi là 'đăng ký một cách rõ ràng để quan sát'.
Có một dự thảo nhanh chóng mã mà thực hiện nhiệm vụ đó
function CreateArrayElementViewModel(inputData) {
// Creating our view model
var result = {
prop : ko.observable(inputData.prop),
val : ko.observable(inputData.val),
isModified: false // This property would be true if entity was edited
};
// Iterate over all properties and subscribe to knockoutjs observables
for(prop in result) {
if (typeof(result[prop].subscribe) != 'undefined') {
result[prop].subscribe(function() { result.isModified = true; });
}
}
return result;
}
Kiểm tra rằng đăng ký là một chức năng để đảm bảo, bạn đang bây giờ chỉ thử nghiệm mà một tài sản tồn tại . Thử nghiệm phải là: 'result.hasOwnProperty (prop) && typeof result [prop] ===" function "' – froginvasion
giải pháp của bạn là hoàn hảo. Bạn có nghĩ đến việc gửi ko.dirtyFlag này cho nhóm ko? –
Tôi thuộc nhóm lõi ko (chỉ có 3 người với Steve Sanderson là nhà phát triển chính). Tư duy hiện tại nói chung là giữ cho cốt lõi chặt chẽ và đưa những thứ như thế này vào các plugin. Tôi có thể xem xét việc đưa này lên như là một dự án thích hợp mặc dù. –