เมื่อใดจึงควรใช้ ko.utils.unwrapObservable?


114

ฉันได้เขียนการผูกแบบกำหนดเองโดยใช้ KnockoutJS ฉันยังไม่แน่ใจว่าเมื่อใดควรใช้ko.utils.unwrapObservable(item)การตรวจสอบโค้ดโดยทั่วไปการโทรนั้นจะตรวจสอบว่าitemเป็นสิ่งที่สังเกตได้หรือไม่ ถ้าเป็นเช่นนั้นให้ส่งคืนค่า () หากไม่ใช่ให้ส่งคืนค่า เมื่อดูที่หัวข้อ Knockout เกี่ยวกับการสร้างการเชื่อมโยงที่กำหนดเองพวกเขามีไวยากรณ์ต่อไปนี้:

var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);

ในกรณีนี้พวกเขาจะเรียกสิ่งที่สังเกตได้ผ่านทาง()แต่จะเรียกko.utils.unwrapObservableด้วย ฉันแค่พยายามจับใจความเมื่อจะใช้อย่างใดอย่างหนึ่งกับอีกอันหนึ่งหรือว่าฉันควรทำตามรูปแบบข้างต้นเสมอและใช้ทั้งสองอย่าง

คำตอบ:


142

คุณควรใช้ko.utils.unwrapObservableในกรณีที่คุณไม่รู้ว่าคุณได้รับการสังเกตหรือไม่ สิ่งนี้มักจะอยู่ในการเชื่อมโยงแบบกำหนดเองซึ่งสามารถเชื่อมโยงกับการเชื่อมโยงที่สังเกตได้หรือไม่สามารถสังเกตได้

ในรหัสที่คุณมีข้างต้นการโทรไปยังvalueAccessor()ไม่ได้แกะกล่องที่สังเกตได้ เป็นเพียงการดึงค่าที่ส่งผ่านไปยังการเชื่อมโยงในบริบทที่ถูกต้อง (มันถูกรวมไว้ในฟังก์ชันเพื่อป้องกัน) ค่าตอบแทนของvalueAccessor()อาจเป็นค่าที่สังเกตได้หรือไม่ก็ได้ มันคืออะไรก็ตามที่ส่งผ่านไปยังการผูกมัด


4
มันขึ้นอยู่กับสถานการณ์จริงๆ การผูกแบบกำหนดเองบางอย่างได้รับการออกแบบให้ใช้งานได้กับสิ่งที่สังเกตได้เท่านั้นดังนั้นคุณสามารถตรวจสอบล่วงหน้า (ko.isObservable) ว่าเป็นสิ่งที่สังเกตได้จากนั้นคุณจะมีอิสระที่จะแกะมันด้วย () หากคุณได้รับอ็อบเจ็กต์ที่อาจมีสิ่งที่สังเกตได้ซ้อนอยู่คุณควรทำko.toJS(yourObject)มากกว่าใช้ko.utils.unwrapObservableถ้าคุณพยายามรับอ็อบเจ็กต์เวอร์ชันที่ไม่ได้ติดตั้งเพื่อส่งผ่านไปยังวิดเจ็ตหรือไลบรารีของบุคคลที่สาม โดยทั่วไปแล้วจะปลอดภัยที่สุดในการใช้ ko.utils.unwrapObservableเพื่อสนับสนุนสิ่งที่สังเกตได้และสิ่งที่ไม่ใช่สิ่งที่สังเกตได้
RP Niemeyer

2
ฉันเดาว่าฉันสับสนกับจุดประสงค์ของko.utils.unwrapObservableมัน เมื่อมองไปที่รหัสก็จะตรวจสอบว่าสามารถสังเกตได้หรือไม่และถ้าเป็นเช่นนั้น Knockout จะเรียกใช้()เพื่อรับค่าของสิ่งที่สังเกตได้มิฉะนั้นจะส่งคืนค่าสำหรับสิ่งที่ไม่สามารถสังเกตได้ หากสิ่งที่ฉันสนใจคือมูลค่าของข้อมูลที่ส่งเข้าสู่การเชื่อมโยงทำไมฉันถึงใช้()ไม่ได้ตลอดไป?
arb

17
คุณไม่รู้ว่าคุณกำลังผ่านสิ่งที่สังเกตได้หรือไม่สามารถสังเกตได้ในการผูกมัด ว่าฉันมีและผูกคนเช่นเช่น myBinding อาจเป็นสิ่งที่สังเกตได้หรืออาจเป็นเพียงคุณสมบัติธรรมดาในโมเดลมุมมอง หากเป็นเพียงคุณสมบัติและฉันเรียกมันว่าเป็นฟังก์ชันคุณจะได้รับข้อผิดพลาด จะคืนค่าให้คุณอย่างปลอดภัยไม่ว่าคุณจะผ่านการสังเกตหรือไม่ก็ตาม data-bind="myBinding: myValue"myValueko.utils.unwrapObservable
RP Niemeyer

10
ฉันขอแนะนำให้ใช้ชวเลข 'ko.unwrap' เนื่องจาก 'ko.utils.unwrapObservable' เป็นนิพจน์ที่ยาวมาก
Ivan Nikitin

3
@IvanNikitin - แน่นอนแค่อยากจะชี้ให้เห็นว่าko.unwrapมีให้ใน 3.0+ หากคุณใช้รุ่นเก่ากว่า 3.0 แสดงว่าko.utils.unwrapObservableยังมีอยู่
RP Niemeyer

12

คำตอบก่อนหน้านี้ถูกต้อง แต่บ่อยครั้งที่ฉันส่งผ่านฟังก์ชันไปยังการเชื่อมโยงที่กำหนดเอง (ฟังก์ชันที่ตรวจสอบสิทธิ์หรือกำหนดสิ่งที่ต้องทำตามอย่างอื่น ฯลฯ ) สิ่งที่ฉันต้องการจริงๆคือการแกะฟังก์ชันใด ๆ แม้ว่าจะไม่ใช่สิ่งที่สังเกตได้ก็ตาม

ต่อไปนี้จะคลายทุกอย่างซ้ำ ๆ :

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 มีค่าเสมอ ฉันไม่จำเป็นต้องกังวลว่าฉันจะส่งผ่านฟังก์ชันค่าที่สังเกตได้ค่าหรือแม้กระทั่งฟังก์ชันภายในสิ่งที่สังเกตได้หรือไม่ สิ่งนี้จะแกะทุกอย่างอย่างถูกต้องจนกว่าจะเข้าที่วัตถุที่ฉันต้องการ

หวังว่าจะช่วยใครบางคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.