Определите, является ли свойство объекта ko.observable

98

Я использую 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);
    }

Но пока все ложно.

Адам Рэкис
источник

Ответы:

157

Knockout включает функцию с именем 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
};

ОБНОВЛЕНИЕ: если вы используете KO 2.1+ - то можете использовать ko.isComputedнапрямую.

Р.П. Нимейер
источник
2
Спасибо. Вы случайно не знаете, как определить, вычисляется ли наблюдаемое? Я могу определить, является ли наблюдаемый массив наблюдаемым $.isArray(vm[key]()), но знаете ли вы, как отличить наблюдаемые от наблюдаемого ko.computed??
Адам Рэкис 08
7
KO 2.1, который должен выйти в ближайшие несколько недель, будет включать ko.isComputedфункцию. Код будет эквивалентен тому, что я добавил к ответу выше.
RP Niemeyer
27

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

ko.isObservable(vm[key])
Марк Робинсон
источник
3

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

Pimbrouwers
источник
0

я использую

ko.utils.unwrapObservable(vm.key)

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

Иван Родригес
источник
2
Это разворачивает наблюдаемое. Он не проверяет, является ли свойство наблюдаемым.
Adam Rackis
1
Ты прав. Но обычно, если вам нужно знать, чтобы получить реальное наблюдаемое значение;)
Иван Родригес
1
Он обеспечивает действительный способ доступа к свойству, которое может быть или не быть наблюдаемым, но не отвечает на вопрос как таковой.
Озил