พิจารณาว่าคุณสมบัติอ็อบเจ็กต์เป็น ko.observable หรือไม่


99

ฉันใช้KnockoutJSเวอร์ชัน 2.0.0

ถ้าฉันบ่วงผ่านคุณสมบัติทั้งหมดของวัตถุว่าฉันสามารถทดสอบว่าแต่ละคุณสมบัติเป็นko.observable? นี่คือสิ่งที่ฉันได้ลองทำแล้ว:

    var vm = {
        prop: ko.observable(''),
        arr: ko.observableArray([]),
        func: ko.computed(function(){
            return this.prop + " computed";
        }, vm)
    };

    for (var key in vm) {
        console.log(key, 
            vm[key].constructor === ko.observable, 
            vm[key] instanceof ko.observable);
    }

แต่จนถึงขณะนี้ทุกอย่างเป็นเท็จ

คำตอบ:


158

ko.isObservable()สิ่งที่น่าพิศวงรวมถึงฟังก์ชั่นที่เรียกว่า เรียกว่าชอบko.isObservable(vm[key])ก็ได้

อัปเดตจากความคิดเห็น:

นี่คือฟังก์ชั่นในการตรวจสอบว่ามีบางสิ่งที่สามารถสังเกตได้จากการคำนวณหรือไม่:

ko.isComputed = function (instance) {
    if ((instance === null) || (instance === undefined) || (instance.__ko_proto__ === undefined)) return false;
    if (instance.__ko_proto__ === ko.dependentObservable) return true;
    return ko.isComputed(instance.__ko_proto__); // Walk the prototype chain
};

อัปเดต: หากคุณใช้ KO 2.1+ - คุณสามารถใช้งานko.isComputedได้โดยตรง


2
ขอบคุณ. คุณบังเอิญรู้หรือไม่ว่าจะคำนวณได้อย่างไร ฉันสามารถระบุได้ว่าสิ่งที่สังเกตได้เป็นอาร์เรย์ที่สังเกตได้ผ่านทาง$.isArray(vm[key]())หรือไม่ แต่คุณรู้วิธีแยกความแตกต่างของสิ่งที่สังเกตได้จาก a ko.computed??
Adam Rackis

7
KO 2.1 ที่น่าจะออกในอีกไม่กี่สัปดาห์ข้างหน้าจะมีko.isComputedฟังก์ชัน รหัสจะเทียบเท่ากับที่ฉันเพิ่มในคำตอบด้านบน
RP Niemeyer


3

ในการตอบสนองต่อคำตอบของ RP Niemeyer หากคุณเพียงแค่ต้องการตรวจสอบว่ามีบางสิ่งที่ "สมัครรับข้อมูล" ได้หรือไม่ (ซึ่งส่วนใหญ่มักจะเป็นเช่นนั้น) แล้วko.isSubscribableยังมีจำหน่าย


0

ฉันกำลังใช้

ko.utils.unwrapObservable(vm.key)

อัปเดต : ในเวอร์ชัน 2.3.0 ko.unwrapถูกเพิ่มเข้ามาแทนที่สำหรับko.utils.unwrapObservable


2
นั่นคือการแกะที่สังเกตได้ ไม่ได้ทดสอบว่าคุณสมบัตินั้นสามารถสังเกตได้หรือไม่
Adam Rackis

1
คุณถูก. แต่โดยปกติแล้วถ้าคุณจำเป็นต้องรู้เพื่อให้ได้ค่าที่สังเกตได้จริง;)
Ivan Rodriguez

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