Câu trả lời trước đó là đúng, nhưng tôi thường chuyển các hàm vào các ràng buộc tùy chỉnh (một hàm kiểm tra quyền hoặc xác định việc cần làm dựa trên một thứ khác, v.v.). Những gì tôi thực sự cần là mở bất kỳ chức năng nào, ngay cả khi nó không thể quan sát được.
Sau đây mở một cách đệ quy MỌI THỨ:
ko.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
Đây là một ví dụ về một ràng buộc tùy chỉnh đơn giản mà tôi đã viết:
//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"
ko.bindingHandlers.replaceWordChars = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var bindingValue = ko.utils.unwrapFunction(valueAccessor);
if (bindingValue) {
$(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
allBindingsAccessor().value($(element).val()); //update viewModel
}
}
}
Bằng cách này, bindValue luôn chứa một giá trị. Tôi không cần phải lo lắng về việc liệu tôi có truyền vào một hàm, một hàm có thể quan sát được, một giá trị hay thậm chí là một hàm bên trong một hàm có thể quan sát được hay không. Thao tác này sẽ mở đúng cách mọi thứ cho đến khi nó đến được đối tượng tôi muốn.
Hy vọng rằng sẽ giúp một ai đó.
ko.toJS(yourObject)
thay vì sử dụngko.utils.unwrapObservable
, nếu bạn đang cố gắng đưa một phiên bản chưa được bao bọc của đối tượng để chuyển vào tiện ích con hoặc thư viện của bên thứ ba. Nói chung, an toàn nhất là sử dụngko.utils.unwrapObservable
để hỗ trợ các vật có thể quan sát và không quan sát được.