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.