2012-03-08 13 views
84

sto usando la versione 2.0.0 KnockoutJSDeterminare se una proprietà dell'oggetto è ko.observable

Se sto scorrendo tutte le proprietà di un oggetto, come posso testare se ogni proprietà è un 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.

risposta

138

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

Aggiornamento da commento:

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

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: Se si utilizza KO 2.1+ - quindi è possibile utilizzare ko.isComputed direttamente.

+2

Grazie. Sai per caso se un osservabile è calcolato? Posso determinare se un osservabile è un array osservabile tramite '$ .isArray (vm [key]())', ma sai come distinguere gli osservabili da un 'ko.computed' ?? –

+7

KO 2.1 che dovrebbe essere disponibile nelle prossime settimane includerà una funzione 'ko.isComputed'. Il codice sarebbe l'equivalente di ciò che ho aggiunto alla risposta sopra. –

21

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

ko.isObservable(vm[key]) 
-1

sto usando

ko.utils.unwrapObservable(vm.key) 

Aggiornamento: A partire dalla versione 2.3.0, ko.unwrap era aggiunto come sostituto per ko.utils.unwrapObservable

+2

Che decomprime un osservabile. Non verifica se una proprietà è osservabile. –

+1

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

+0

Fornisce un modo valido per accedere a una proprietà che può o non può essere osservabile, ma che non risponde alla domanda di per sé. – Ozil

1

Per rispondere alla risposta di RP Niemeyer, se stai semplicemente cercando di determinare e se qualcosa è "sottoscrivibile" (che è il più delle volte il caso). Quindi è disponibile anche lo ko.isSubscribable.

Problemi correlati