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.

Adam Rackis
sumber

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.

RP Niemeyer
sumber
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])
Mark Robinson
sumber
3

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

pimbrouwers
sumber
0

saya menggunakan

ko.utils.unwrapObservable(vm.key)

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

Ivan Rodriguez
sumber
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