Определите, является ли свойство объекта 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


3

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


0

я использую

ko.utils.unwrapObservable(vm.key)

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


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

1
Ты прав. Но обычно, если вам нужно знать, чтобы получить реальное наблюдаемое значение;)
Иван Родригес

1
Он обеспечивает действительный способ доступа к свойству, которое может быть или не быть наблюдаемым, но не отвечает на вопрос как таковой.
Озил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.