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.

Adam Rackis
quelle

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.

RP Niemeyer
quelle
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])
Mark Robinson
quelle
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.

Zuhälter
quelle
0

Ich benutze

ko.utils.unwrapObservable(vm.key)

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

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