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.