Determinar si la propiedad de un objeto es ko.observable

98

Estoy usando KnockoutJS versión 2.0.0

Si estoy recorriendo todas las propiedades de un objeto, ¿cómo puedo probar si cada propiedad es un ko.observable? Esto es lo que he probado hasta ahora:

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

Pero hasta ahora todo es falso.

Adam Rackis
fuente

Respuestas:

157

Knockout incluye una función llamada ko.isObservable(). Puedes llamarlo como ko.isObservable(vm[key]).

Actualización del comentario:

Aquí hay una función para determinar si algo es un observable calculado:

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

ACTUALIZACIÓN: Si está usando KO 2.1+, puede usarlo ko.isComputeddirectamente.

RP Niemeyer
fuente
2
Gracias. ¿Sabe por casualidad cómo saber si se calcula un observable? Puedo determinar si un observable es una matriz observable a través de $.isArray(vm[key]()), pero ¿sabe cómo diferenciar observables de un ko.computed?
Adam Rackis
7
KO 2.1 que debería estar disponible en las próximas semanas incluirá una ko.isComputedfunción. El código sería el equivalente a lo que agregué a la respuesta anterior.
RP Niemeyer
27

Knockout tiene la siguiente función que creo que es lo que estás buscando:

ko.isObservable(vm[key])
Mark Robinson
fuente
3

Para agregar a la respuesta de RP Niemeyer, si simplemente está buscando determinar si algo es "suscribible" (que es el caso más frecuente). Entonces ko.isSubscribabletambién está disponible.

pimbrouwers
fuente
0

Estoy usando

ko.utils.unwrapObservable(vm.key)

Actualización : A partir de la versión 2.3.0, ko.unwrapse agregó como sustituto deko.utils.unwrapObservable

Iván Rodríguez
fuente
2
Eso desenvuelve un observable. No prueba si una propiedad es observable.
Adam Rackis
1
Tienes razón. Pero por lo general, si necesita saber para obtener el valor observable real;)
Iván Rodríguez
1
Proporciona una forma válida de acceder a una propiedad que puede o no ser observable, sin embargo, no responde a la pregunta per se.
Ozil