Bir nesne özelliğinin ko.observable olup olmadığını belirleme


99

KnockoutJS 2.0.0 sürümünü kullanıyorum

Bir nesnenin tüm özelliklerinde döngü oluşturuyorsam, her özelliğin bir olup olmadığını nasıl test edebilirim ko.observable? Şimdiye kadar denediklerim şunlar:

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

Ama şimdiye kadar her şey yanlış.

Yanıtlar:


158

Nakavt adlı bir işlevi içerir ko.isObservable(). Gibi diyebilirsiniz ko.isObservable(vm[key]).

Yorumdan güncelleme:

İşte bir şeyin hesaplanmış bir gözlemlenebilir olup olmadığını belirleyen bir fonksiyon:

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

GÜNCELLEME: KO 2.1+ kullanıyorsanız - o zaman ko.isComputeddoğrudan kullanabilirsiniz .


2
Teşekkür ederim. Bir gözlemlenebilirin hesaplanıp hesaplanmadığını tesadüfen biliyor musunuz? Bir gözlemlenebilirin gözlemlenebilir bir dizi olup olmadığını belirleyebilirim $.isArray(vm[key]()), ancak gözlenebilirleri a'dan nasıl ayırt edeceğinizi biliyor musunuz ko.computed?
Adam Rackis

7
Önümüzdeki birkaç hafta içinde çıkması gereken KO 2.1 bir ko.isComputedfonksiyon içerecek . Kod, yukarıdaki cevaba eklediğim şeye eşdeğer olacaktır.
RP Niemeyer

27

Nakavt, aradığınız şeyin olduğunu düşündüğüm aşağıdaki işleve sahiptir:

ko.isObservable(vm[key])

3

RP Niemeyer'in cevabına bağlanmak için, eğer bir şeyin "abone olunabilir" olup olmadığını belirlemek istiyorsanız (çoğu zaman durum böyledir). O zaman ko.isSubscribableda mevcuttur.


0

kullanıyorum

ko.utils.unwrapObservable(vm.key)

Güncelleme : Sürüm 2.3.0 itibariyle ko.unwrapiçin yedek olarak ilave edilmiştirko.utils.unwrapObservable


2
Bu gözlemlenebilir bir şeyi çözer. Bir mülkün gözlemlenebilir olup olmadığını test etmez.
Adam Rackis

1
Haklısın. Ama genellikle gerçek gözlemlenebilir değeri elde etmeyi bilmeniz gerekiyorsa;)
Ivan Rodriguez

1
Gözlemlenebilir olan veya olmayan bir özelliğe erişmek için geçerli bir yol sağlar, ancak soruyu tek başına yanıtlamaz.
Özil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.