Tôi đang sử dụng cả Knockout (phiên bản 2.0) và jQuery Mobile (phiên bản 1.0.1) trong cùng một dự án. Vấn đề là với dữ liệu ràng buộc để chọn danh sách. jQuery Mobile trình bày các danh sách lựa chọn theo cách mà giá trị dường như được chọn và danh sách thực tế là các phần tử riêng biệt. Điều này được khắc phục bằng cách thực hiệnKnockout và jQuery Mobile: Dữ liệu ràng buộc để chọn danh sách
$(element).selectmenu('refresh', true);
sau khi thay đổi danh sách hoặc giá trị đã chọn. Dựa trên kinh nghiệm của tôi, đây là một tình huống nguy hiểm vì các nhà phát triển thường quên làm mới danh sách lựa chọn.
Để giảm bớt điều này, tôi đã viết trình xử lý ràng buộc Knockout của riêng mình. Các giá trị này được ràng buộc với danh sách lựa chọn với đoạn mã sau:
<select name="selection" data-bind="jqmOptions: values, optionsValue: 'id', optionsText: 'name', value: selectedValue">
</select>
Việc thực hiện jqmOptions:
ko.bindingHandlers.jqmOptions = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.init !== 'undefined') {
ko.bindingHandlers.options.init(element, valueAccessor, allBindingsAccessor, viewModel);
}
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.update !== 'undefined') {
ko.bindingHandlers.options.update(element, valueAccessor, allBindingsAccessor, viewModel);
}
var instance = $.data(element, 'selectmenu');
if (instance) {
$(element).selectmenu('refresh', true);
}
}
};
này sử dụng có nguồn gốc options
ràng buộc nhưng thêm vào đó, nó sẽ tự động làm mới chọn danh sách sau khi thay đổi giá trị danh sách. Tuy nhiên, có vấn đề với điều này khi tôi thay đổi giá trị đã chọn. Nếu trước tiên tôi đặt giá trị danh sách, jqmOptions của tôi sẽ làm mới danh sách chọn nhưng tại thời điểm đó, giá trị đã chọn chưa được đặt. Tôi kết thúc với một danh sách lựa chọn, trong đó có tất cả các giá trị chính xác và tùy chọn bên trong bên phải được chọn, nhưng jQuery Mobile vẫn hiển thị giá trị mặc định như được chọn.
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
Loại trừ không cho phép tôi đặt giá trị danh sách trước và sau đó đặt giá trị danh sách, vì trong trường hợp này không có giá trị được phép khi tôi đặt giá trị đã chọn. Do đó giá trị được chọn luôn không xác định.
Có cách nào để viết liên kết tùy chỉnh Knockout mà sẽ làm mới phần tử danh sách chọn trong cả hai trường hợp: khi thay đổi giá trị danh sách và khi thay đổi giá trị đã chọn?
Hiện nay tôi giải quyết tình huống này với đoạn mã sau:
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
this.values(someArrayOfValues);
Đây không phải là giải pháp rất thanh lịch tuy nhiên và tôi muốn giải quyết nó tốt hơn.
Hãy xem bài viết blog này: http://pieterderycke.wordpress.com/2012/09/22/creating- a-custom-knockout-binding-cho-the-jquery-mobile-listview/Nó giải thích một ràng buộc listview tùy chỉnh cho jquery di động. – MuSTaNG