Javascript 确定对象属性是否可观察
我使用的是2.0.0版 如果我循环遍历一个对象的所有属性,我如何测试每个属性是否是一个可观察的Javascript 确定对象属性是否可观察,javascript,knockout.js,Javascript,Knockout.js,我使用的是2.0.0版 如果我循环遍历一个对象的所有属性,我如何测试每个属性是否是一个可观察的ko.observable?以下是我迄今为止所尝试的: var vm = { prop: ko.observable(''), arr: ko.observableArray([]), func: ko.computed(function(){ return this.prop + " computed";
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);
}
但到目前为止,一切都是假的。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
。Knockout具有以下功能,我认为这正是您需要的功能:
ko.isObservable(vm[key])
我正在使用
ko.utils.unwrapObservable(vm.key)
更新:从2.3.0版开始,添加了
ko.unwrap
,作为ko.utils.unwrapObservable
的替代品,以补充RP Niemeyer的答案,如果您只是想确定某个内容是否“可订阅”(这是最常见的情况)。然后也可以使用。谢谢。您是否碰巧知道如何判断是否计算了可观测值?我可以通过$.isArray(vm[key]())
确定一个可观察数组是否是一个可观察数组,但是你知道如何区分可观察数组和ko。计算的?应该在未来几周推出的ko 2.1将包括ko.isComputed
函数。代码将与我在上面的答案中添加的代码相同。这将打开一个可观察的。它不会测试一个属性是否是可观察的。你是对的。但通常情况下,如果您需要了解以获得实际的可观察值;)它提供了一种有效的方法来访问可能可见或不可见的属性,但它本身并没有回答这个问题。