javascript knockout.js

javascript - Determine si la propiedad de un objeto es ko.observable



knockout.js (4)

Estoy usando la versión 2.0.0 de KnockoutJS

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 intentado 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.


Estoy usando

ko.utils.unwrapObservable(vm.key)

Actualización : a partir de la versión 2.3.0, se agregó ko.unwrap como sustituto de ko.utils.unwrapObservable


Knockout incluye una función llamada ko.isObservable() . Puede 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á utilizando KO 2.1+, puede usar ko.isComputed directamente.


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

ko.isObservable(vm[key])


Para seguir la respuesta de RP Niemeyer, si solo está buscando determinar si algo es "susceptible de suscribirse" (lo cual es más frecuente). Entonces ko.isSubscribable también está disponible.