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.

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.


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])

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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.