web-dev-qa-db-ja.com

オブジェクトプロパティがko.observableかどうかを判別

KnockoutJS version 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);
    }

しかし、これまでのところ、すべてが間違っています。

97
Adam Rackis

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 直接。

153
RP Niemeyer

Knockoutには次の機能があり、あなたが探しているものだと思います。

ko.isObservable(vm[key])
27
Mark Robinson

何かが「サブスクライブ可能」であるかどうかを判断するだけの場合(ほとんどの場合)、RP Niemeyerの答えにたどり着きます。次に ko.isSubscribable も使用できます。

3
pim