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

Ada*_*kis 97 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

RP *_*yer 154

Knockout包含一个名为的函数ko.isObservable().你可以这样称呼它ko.isObservable(vm[key]).

评论更新:

这是一个确定某个东西是否是一个计算的observable的函数:

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
};
Run Code Online (Sandbox Code Playgroud)

更新:如果您使用的是KO 2.1+ - 那么您可以ko.isComputed直接使用.

  • 应该在接下来的几周里出来的KO 2.1将包含一个`ko.isComputed`函数.代码将等同于我在上面的答案中添加的内容. (7认同)
  • 谢谢.您是否偶然知道如何判断是否计算了可观察量?我可以通过`$ .isArray(vm [key]())来确定observable是否是一个可观察的数组,但是你知道如何区分observable和`ko.computed` ?? (2认同)

Mar*_*son 27

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

ko.isObservable(vm[key])
Run Code Online (Sandbox Code Playgroud)