คำตอบก่อนหน้านี้ถูกต้อง แต่บ่อยครั้งที่ฉันส่งผ่านฟังก์ชันไปยังการเชื่อมโยงที่กำหนดเอง (ฟังก์ชันที่ตรวจสอบสิทธิ์หรือกำหนดสิ่งที่ต้องทำตามอย่างอื่น ฯลฯ ) สิ่งที่ฉันต้องการจริงๆคือการแกะฟังก์ชันใด ๆ แม้ว่าจะไม่ใช่สิ่งที่สังเกตได้ก็ตาม
ต่อไปนี้จะคลายทุกอย่างซ้ำ ๆ :
ko.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
นี่คือตัวอย่างของการผูกแบบกำหนดเองง่ายๆที่ฉันเขียน:
//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
}
}
}
วิธีนี้ bindingValue มีค่าเสมอ ฉันไม่จำเป็นต้องกังวลว่าฉันจะส่งผ่านฟังก์ชันค่าที่สังเกตได้ค่าหรือแม้กระทั่งฟังก์ชันภายในสิ่งที่สังเกตได้หรือไม่ สิ่งนี้จะแกะทุกอย่างอย่างถูกต้องจนกว่าจะเข้าที่วัตถุที่ฉันต้องการ
หวังว่าจะช่วยใครบางคน
ko.toJS(yourObject)
มากกว่าใช้ko.utils.unwrapObservable
ถ้าคุณพยายามรับอ็อบเจ็กต์เวอร์ชันที่ไม่ได้ติดตั้งเพื่อส่งผ่านไปยังวิดเจ็ตหรือไลบรารีของบุคคลที่สาม โดยทั่วไปแล้วจะปลอดภัยที่สุดในการใช้ko.utils.unwrapObservable
เพื่อสนับสนุนสิ่งที่สังเกตได้และสิ่งที่ไม่ใช่สิ่งที่สังเกตได้