Determina se la proprietà di un oggetto è ko.observable


98

Sto usando KnockoutJS versione 2.0.0

Se sto scorrendo tutte le proprietà di un oggetto, come posso verificare se ciascuna proprietà è una ko.observable? Ecco cosa ho provato finora:

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

Ma finora tutto è falso.

Risposte:


157

Knockout include una funzione chiamata ko.isObservable(). Puoi chiamarlo come ko.isObservable(vm[key]).

Aggiorna dal commento:

Ecco una funzione per determinare se qualcosa è un osservabile calcolato:

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

AGGIORNAMENTO: Se stai usando KO 2.1+, puoi usarlo ko.isComputeddirettamente.


2
Grazie. Sai per caso come sapere se viene calcolato un osservabile? Posso determinare se un osservabile è un array osservabile tramite $.isArray(vm[key]()), ma sai come differenziare gli osservabili da un ko.computed??
Adam Rackis

7
KO 2.1 che dovrebbe uscire nelle prossime settimane includerà una ko.isComputedfunzione. Il codice sarebbe l'equivalente di quello che ho aggiunto alla risposta sopra.
RP Niemeyer

27

Knockout ha la seguente funzione che penso sia quello che stai cercando:

ko.isObservable(vm[key])

3

Per continuare con la risposta di RP Niemeyer, se stai semplicemente cercando di determinare se qualcosa è "sottoscrivibile" (che è più spesso il caso). Quindi ko.isSubscribableè anche disponibile.


0

sto usando

ko.utils.unwrapObservable(vm.key)

Aggiornamento : a partire dalla versione 2.3.0, è ko.unwrapstato aggiunto come sostituto diko.utils.unwrapObservable


2
Che scartano un osservabile. Non verifica se una proprietà è osservabile.
Adam Rackis

1
Hai ragione. Ma di solito se hai bisogno di sapere per ottenere il valore reale osservabile;)
Ivan Rodriguez

1
Fornisce un modo valido per accedere a una proprietà che può o non può essere osservabile, tuttavia non risponde alla domanda di per sé.
Ozil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.