2012-02-16 3 views

答えて

11

計算されたobservablesはすぐに作成時に評価されます。あなたのケースでは、まだviewModelが作成されていないので、エラーが発生します。

カップルの選択肢:リテラル、あなたの最初のオブジェクトの外にそれを

-Create:

var viewModel = { 
    firstName: ko.observable("r"), 
    lastName: ko.observable("j"), 
}; 
viewModel.fullName = ko.computed(function() { 
     return viewModel.firstName(); 
}); 

-Create機能であなたのビューモデル:

var ViewModel = function() { 
    this.firstName = ko.observable("r"); 
    this.lastName = ko.observable("j"); 
    this.fullName = ko.computed(function() { 
      return this.firstName(); 
    }, this); 
}; 

ko.applyBindings(new ViewModel()); 
+0

ありがとう非常にRP – iRamesh

+0

@RPNiemeyerは、プロトタイプを使用するときに計算された観測値で 'this'への参照を取得することが可能です。次のようになります: 'MyClass.prototype.computeSum = ko.computed(function(){// ...}、this);'ここでは、これはウィンドウを指します。私はインスタンスを参照する必要があります。 – crush

+0

フォローアップ。 ko.computedは各インスタンスごとに個別に作成する必要があるため、これは望ましくないことに気付きました。 – crush

7

オブジェクトリテラルは非常に簡単です作成すると、素晴らしいものになります。しかしこれは、ビューモデルを作成するために関数を使用する方が好きな理由の1つです。オブジェクトリテラルでは、@RPNiemeyerが指摘するように、ビューモデルを拡張して計算された...を作成するか、関数を使ってすべてを1つの関数ステートメントで行うことができます。

別のオプションは、私が一番好きな暴露のモジュールパターン、使用することです:@RPNiemeyerからソリューションに加えてhttp://jsfiddle.net/johnpapa/36N4m/1/

var viewModel = (function() { 
    var 
     firstName = ko.observable("r"), 
     lastName = ko.observable("j"), 
     fullName = ko.computed(function() { 
      return firstName(); 
     }); 
     return { 
      firstName: firstName, 
      lastName: lastName, 
      fullName: fullName 
     } 
})(); 

ko.applyBindings(viewModel);​ 
+0

Johnに感謝します。これは、ビューモデルを作成する興味深い方法です – iRamesh

3

を、さらに別の代替があります:

var viewModel = { 
    firstName: ko.observable("r"), 
    lastName: ko.observable("j"), 
    fullName: ko.computed({ 
     read: function() { return viewModel.firstName(); }, 
     deferEvaluation: true 
    }) 
}; 

計算されたコールバックは外側のスコープのviewModel変数を参照し、は、作成時にviewModel変数が準備できないため、計算が必要なときにのみ呼び出されるようにします。

関連する問題