确定对象属性是否为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);
    }

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

Answers:


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功能。该代码将等效于我在上面的答案中添加的代码。
RP Niemeyer 2012年

27

淘汰赛具有以下功能,我认为这是您要寻找的功能:

ko.isObservable(vm[key])

3

要继续研究RP Niemeyer的答案,如果您只是想确定某些东西是否“可订阅”(通常是这种情况)。然后ko.isSubscribable也可用。


0

我正在使用

ko.utils.unwrapObservable(vm.key)

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


2
那揭开了一个可观察的面纱。它不会测试属性是否是可观察的。
亚当·拉基斯

1
你是对的。但通常,如果您需要知道获得实际的可观察值;)
伊万·罗德里格斯

1
它提供了一种访问属性的有效方法,该属性可能可观察也可能不可观察,但是它本身无法回答问题。
厄齐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.