敲击可观察取决于同一物体的'兄弟'

时间:2013-04-03 07:19:31

标签: javascript knockout.js

此代码将起作用:

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

2 个答案:

答案 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());