1

此代码将起作用:

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; },"")
};
4

2 回答 2

3

您可以尝试使用deferEvaluation来延迟......好吧......计算计算的评估,直到它被实际访问:

var a = {
   b : ko.observable(1),
   c : ko.computed({read: function(){ return a.b() + 1; }, deferEvaluation: true})
};
于 2013-04-03T08:08:49.730 回答
0

您必须使用构造函数,例如

MyViewModel = function() {
   this.b = ko.observable(1);
   this.c = ko.computed(function() {
      return this.b() + 1;
   }, this);
}

进而

ko.applyBindings(new MyViewModel());
于 2013-04-03T07:26:58.647 回答