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

2番目のコードのようにオブジェクトを定義する必要があるとしましょう。それを解決する方法はありますか? 私はtry/catchとsetTimeoutを含むアイデアを持っていますが、それは醜いものになるので、誰かが別のアイデアを持っているかどうか聞きたかった.

編集

ランタイムを過ぎて評価を遅らせるには、setTimeoutだけで、try/catchは必要ありません。それにもかかわらず、私はそれについてあなたのコメントを聞きたいです.

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 に答える