确定对象属性是否为ko.observable

时间:2012-03-08 21:53:23

标签: javascript knockout.js

我正在使用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);
    }

但到目前为止,一切都是错误的。

4 个答案:

答案 0 :(得分:150)

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

答案 1 :(得分:25)

Knockout具有以下功能,我认为您正在寻找:

ko.isObservable(vm[key])

答案 2 :(得分:1)

如果您只是想确定某些内容是否可以订阅,那么要接受RP Niemeyer的答案。" (最常见的情况)。然后ko.isSubscribable也可用。

答案 3 :(得分:-2)

我正在使用

ko.utils.unwrapObservable(vm.key)

更新:从版本2.3.0开始,添加了ko.unwrap替代ko.utils.unwrapObservable