Визначте, чи властивість об’єкта ко.спостережна


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

Нокаут включає функцію, яку називають 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??
Адам Ракіс

7
KO 2.1, який повинен з’явитися протягом найближчих кількох тижнів, включає ko.isComputedфункцію. Код був би еквівалентний тому, що я додав до відповіді вище.
РП Німайєр


3

Щоб взяти участь у відповіді Р. П. Німейєра, якщо ви просто хочете визначити, чи є щось "підключене" (що найчастіше трапляється). Тоді ko.isSubscribableтакож доступний.


0

Я використовую

ko.utils.unwrapObservable(vm.key)

Оновлення : Станом на версію 2.3.0 ko.unwrapдодано як замінуko.utils.unwrapObservable


2
Це розгортає спостережуване. Він не перевіряє, чи властивість є спостережуваною.
Адам Ракіс

1
Ти маєш рацію. Але зазвичай, якщо вам потрібно знати, щоб отримати фактичне спостережуване значення;)
Іван Родрігес

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