Tentukan apakah properti objek adalah ko.observable


98

Saya menggunakan KnockoutJS versi 2.0.0

Jika saya mengulang semua properti dari suatu objek, bagaimana cara menguji apakah setiap properti adalah a ko.observable? Inilah yang saya coba sejauh ini:

    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);
    }

Tapi sejauh ini semuanya salah.

Jawaban:


157

Knockout mencakup fungsi yang disebut ko.isObservable(). Anda bisa menyebutnya seperti ko.isObservable(vm[key]).

Pembaruan dari komentar:

Berikut adalah fungsi untuk menentukan apakah sesuatu merupakan observasi yang dihitung:

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
};

UPDATE: Jika Anda menggunakan KO 2.1+ - maka Anda dapat menggunakan ko.isComputedsecara langsung.


2
Terima kasih. Apakah Anda secara kebetulan tahu bagaimana cara mengetahui apakah sebuah observasi dihitung? Saya dapat menentukan apakah yang dapat diamati adalah array yang dapat diamati melalui $.isArray(vm[key]()), tetapi apakah Anda tahu cara membedakan yang dapat diamati dari ko.computed??
— Adam Rackis

7
KO 2.1 yang harus keluar dalam beberapa minggu ke depan akan menyertakan ko.isComputedfungsi. Kode tersebut akan sama dengan apa yang saya tambahkan ke jawaban di atas.
— RP Niemeyer

27

Knockout memiliki fungsi berikut yang menurut saya adalah apa yang Anda cari:

ko.isObservable(vm[key])

3

Untuk mengacu pada jawaban RP Niemeyer, jika Anda hanya ingin menentukan apakah sesuatu "dapat dilanggan" (yang paling sering terjadi). Kemudian ko.isSubscribablejuga tersedia.


0

saya menggunakan

ko.utils.unwrapObservable(vm.key)

Pembaruan : Pada versi 2.3.0, ko.unwrapditambahkan sebagai penggantiko.utils.unwrapObservable


2
Itu membuka sebuah observasi. Itu tidak menguji apakah properti adalah yang dapat diamati.
— Adam Rackis

1
Kamu benar. Tetapi biasanya jika Anda perlu mengetahui untuk mendapatkan nilai observasi aktual;)
— Ivan Rodriguez

1
Ini memberikan cara yang valid untuk mengakses properti yang mungkin atau mungkin tidak dapat diamati namun tidak menjawab pertanyaan itu sendiri.
— Ozil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.