オブジェクトプロパティが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

ノックアウトには、という関数が含まれています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
Adam Rackis

7
今後数週間でリリースされる予定のKO 2.1には、ko.isComputed機能が含まれます。コードは、上記の回答に追加したものと同等です。
RP Niemeyer


3

RP Niemeyerの回答を補足するために、単に何かが「サブスクライブ可能」かどうかを判断するだけの場合(ほとんどの場合)。その後ko.isSubscribableもご利用いただけます。


0

私は使っています

ko.utils.unwrapObservable(vm.key)

更新:バージョン2.3.0以降、のko.unwrap代わりとして追加されましたko.utils.unwrapObservable


2
それはオブザーバブルをアンラップします。プロパティが監視可能かどうかはテストしません。
Adam Rackis、2014

1
あなたが正しい。しかし、通常、実際の観測可能な値を取得するために知る必要がある場合;)
Ivan Rodriguez

1
これは、監視可能かどうかにかかわらず、プロパティにアクセスするための有効な方法を提供しますが、それ自体は質問には答えません。
Ozil 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.