Bestimmen Sie, ob eine Objekteigenschaft ko.observable ist


98

Ich verwende KnockoutJS Version 2.0.0

Wie kann ich testen, ob jede Eigenschaft eine ist, wenn ich alle Eigenschaften eines Objekts durchlaufe ko.observable? Folgendes habe ich bisher versucht:

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

Aber bisher ist alles falsch.

Antworten:


157

Knockout enthält eine Funktion namens ko.isObservable(). Sie können es so nennen ko.isObservable(vm[key]).

Update vom Kommentar:

Hier ist eine Funktion, um festzustellen, ob etwas eine berechnete beobachtbare Größe ist:

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: Wenn Sie KO 2.1+ verwenden, können Sie es ko.isComputeddirekt verwenden.


2
Danke dir. Wissen Sie zufällig, wie Sie feststellen können, ob ein Observable berechnet wird? Ich kann feststellen, ob ein Observable ein Observable Array über ist $.isArray(vm[key]()), aber wissen Sie, wie man Observables von einem unterscheidet ko.computed?
Adam Rackis

7
KO 2.1, das in den nächsten Wochen herauskommen soll, wird eine ko.isComputedFunktion enthalten. Der Code entspricht dem, was ich der obigen Antwort hinzugefügt habe.
RP Niemeyer

27

Knockout hat die folgende Funktion, nach der Sie meiner Meinung nach suchen:

ko.isObservable(vm[key])

3

Um auf die Antwort von RP Niemeyer einzugehen, wenn Sie lediglich feststellen möchten, ob etwas "abonnierbar" ist (was meistens der Fall ist). Dann ko.isSubscribableist auch verfügbar.


0

Ich benutze

ko.utils.unwrapObservable(vm.key)

Update : Ab Version 2.3.0 ko.unwrapwurde als Ersatz für hinzugefügtko.utils.unwrapObservable


2
Das packt ein beobachtbares aus. Es wird nicht getestet, ob eine Eigenschaft beobachtbar ist.
Adam Rackis

1
Du hast recht. Aber normalerweise, wenn Sie wissen müssen, um den tatsächlich beobachtbaren Wert zu erhalten;)
Ivan Rodriguez

1
Es bietet eine gültige Möglichkeit, auf eine Eigenschaft zuzugreifen, die möglicherweise beobachtbar ist oder nicht, beantwortet jedoch die Frage per se nicht.
Ozil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.