此代码将起作用:
var a = {};
a.b = ko.observable(1);
a.c = ko.computed(function(){ return a.b() + 1; });
这个(显然)不会:
var a = {
b : ko.observable(1),
c : ko.computed(function(){ return a.b() + 1; })
};
让我说我真的需要在第二个代码中定义我的对象,有什么方法可以解决这个问题吗?我有一个涉及try / catch和setTimeout的想法,但它会变得难看,所以我想知道是否有人有另一个想法。
结果我不需要try / catch,只需要一个setTimeout来延迟评估超过运行时。但是我想听听你对此的评论。
var delayedComputed = function( comp, init ){
var a = ko.observable( init );
// added the initial value because some functions would like to use
// string or array methods, and would fail to do so on an "undefined"
setTimout(function (){
var b = ko.computed( comp );
b.subscribe(a);
a(b());
},1);
return a;
},
a = {
b : ko.observable(1),
c : delayedComputed(function(){ return a.b() + 1; },"")
};
答案 0 :(得分:3)
您可以尝试使用 deferEvaluation 来延迟计算的......好...评估,直到实际访问它为止:
var a = {
b : ko.observable(1),
c : ko.computed({read: function(){ return a.b() + 1; }, deferEvaluation: true})
};
答案 1 :(得分:0)
你必须使用像
这样的构造函数MyViewModel = function() {
this.b = ko.observable(1);
this.c = ko.computed(function() {
return this.b() + 1;
}, this);
}
然后
ko.applyBindings(new MyViewModel());