2012-03-08 4 views
84

Я использую KnockoutJS версии 2.0.0Определить, если свойство объекта является ko.observable

Если я цикл через все свойства объекта, как я могу проверить, является ли каждое свойство является 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); 
    } 

Но пока все неверно.

ответ

138

Нокаут включает в себя функцию под названием 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

спасибо. Вы случайно знаете, как определить, вычисляется ли наблюдаемое? Я могу определить, является ли наблюдаемый наблюдаемым массивом через $ .isArray (vm [key]()) ', но знаете ли вы, как отличать наблюдаемые от' ko.computed' ?? –

+7

KO 2.1, который должен быть в течение следующих нескольких недель, будет включать функцию 'ko.isComputed'. Код будет эквивалентен тому, что я добавил в ответ выше. –

21

Нокаут имеет следующую функцию, которую я думаю, это то, что вы ищете:

ko.isObservable(vm[key]) 
-1

Я использую

ko.utils.unwrapObservable(vm.key) 

Update: Начиная с версии 2.3.0, ko.unwrap был добавлено в замену ko.utils.unwrapObservable

+2

Это разворачивает наблюдаемое. Он не проверяет, является ли свойство наблюдаемым. –

+1

Вы правы. Но обычно, если вам нужно знать, чтобы получить фактическое наблюдаемое значение;) –

+0

Он предоставляет действительный способ доступа к объекту, который может быть или не быть видимым, однако он не отвечает на вопрос как таковой. – Ozil

1

Чтобы ответить на ответ Р.П. Нимейера, если вы просто хотите определить e, если что-то «подписывается» (что наиболее часто бывает). Тогда также доступен ko.isSubscribable.

Смежные вопросы