Определить, является ли свойство объекта ko.observable
Я использую KnockoutJS версия 2.0.0
Если я просматриваю все свойства объекта, как я могу проверить, является ли каждое свойство ko.observable
? Вот что я пробовал до сих пор:
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);
}
Но пока все неверно.
Ответы
Ответ 1
Нокаут включает функцию, называемую ko.isObservable()
. Вы можете назвать это как ko.isObservable(vm[key])
.
Обновление от комментария:
Вот функция, чтобы определить, является ли что-то вычислимым наблюдаемым:
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: если вы используете KO 2.1+, вы можете напрямую использовать ko.isComputed
.
Ответ 2
У нокаута есть следующая функция, которую я считаю именно тем, что вы ищете:
ko.isObservable(vm[key])
Ответ 3
Чтобы ответить на ответ RP Niemeyer, если вы просто хотите определить, что-то "подписывается" (что наиболее часто бывает). Тогда ko.isSubscribable
также доступен.
Ответ 4
Я использую
ko.utils.unwrapObservable(vm.key)
Обновление. Начиная с версии 2.3.0 вместо ko.utils.unwrapObservable
был добавлен ko.unwrap