Ustal, czy właściwość obiektu to ko.observable

98

Używam KnockoutJS wersji 2.0.0

Jeśli przeglądam wszystkie właściwości obiektu, jak mogę sprawdzić, czy każda właściwość jest ko.observable? Oto, czego próbowałem do tej pory:

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

Ale na razie wszystko jest fałszywe.

Adam Rackis
źródło

Odpowiedzi:

157

Knockout zawiera funkcję o nazwie ko.isObservable(). Możesz to nazwać jak ko.isObservable(vm[key]).

Aktualizacja z komentarza:

Oto funkcja określająca, czy coś jest obserwowalną obliczeniową:

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: Jeśli używasz KO 2.1+ - możesz użyć ko.isComputedbezpośrednio.

RP Niemeyer
źródło
2
Dziękuję Ci. Czy przypadkiem wiesz, jak sprawdzić, czy obliczana jest obserwowalna? Mogę określić, czy obserowalna jest tablicą obserowalną za pośrednictwem $.isArray(vm[key]()), ale czy wiesz, jak odróżnić obserowalne od ko.computed?
Adam Rackis
7
KO 2.1, który powinien zostać wydany w ciągu najbliższych kilku tygodni, będzie zawierał ko.isComputedfunkcję. Kod byłby odpowiednikiem tego, co dodałem do odpowiedzi powyżej.
RP Niemeyer
27

Knockout ma następującą funkcję, która moim zdaniem jest tym, czego szukasz:

ko.isObservable(vm[key])
Mark Robinson
źródło
3

Aby skorzystać z odpowiedzi RP Niemeyera, jeśli po prostu chcesz określić, czy coś jest „subskrybowane” (co jest najczęściej spotykane). Wtedy ko.isSubscribablejest również dostępny.

pimbrouwers
źródło
0

używam

ko.utils.unwrapObservable(vm.key)

Aktualizacja : od wersji 2.3.0 ko.unwrapzostał dodany jako zamiennikko.utils.unwrapObservable

Ivan Rodriguez
źródło
2
To otwiera obserwowalne. Nie sprawdza, czy właściwość jest obserwowalna.
Adam Rackis
1
Masz rację. Ale zwykle, jeśli chcesz wiedzieć, aby uzyskać rzeczywistą obserwowalną wartość;)
Ivan Rodriguez
1
Zapewnia prawidłowy sposób dostępu do właściwości, która może być obserwowalna lub nie, ale nie odpowiada na pytanie jako takie.
Ozil,