これはフィドルです。http://jsfiddle.net/iRamesh/36N4m/この計算された観測値が観測値にアクセスできない理由を理解してください。
計算された観測値が何らかの値を返さない理由がわかりません。私はそれを動作させる方法を知っていますが、なぜ現在のコードが動作していないのかわかりません。助けてください
これはフィドルです。http://jsfiddle.net/iRamesh/36N4m/この計算された観測値が観測値にアクセスできない理由を理解してください。
計算された観測値が何らかの値を返さない理由がわかりません。私はそれを動作させる方法を知っていますが、なぜ現在のコードが動作していないのかわかりません。助けてください
計算された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());
オブジェクトリテラルは非常に簡単です作成すると、素晴らしいものになります。しかしこれは、ビューモデルを作成するために関数を使用する方が好きな理由の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);
Johnに感謝します。これは、ビューモデルを作成する興味深い方法です – iRamesh
を、さらに別の代替があります:
var viewModel = {
firstName: ko.observable("r"),
lastName: ko.observable("j"),
fullName: ko.computed({
read: function() { return viewModel.firstName(); },
deferEvaluation: true
})
};
計算されたコールバックは外側のスコープのviewModel
変数を参照し、は、作成時にviewModel
変数が準備できないため、計算が必要なときにのみ呼び出されるようにします。
ありがとう非常にRP – iRamesh
@RPNiemeyerは、プロトタイプを使用するときに計算された観測値で 'this'への参照を取得することが可能です。次のようになります: 'MyClass.prototype.computeSum = ko.computed(function(){// ...}、this);'ここでは、これはウィンドウを指します。私はインスタンスを参照する必要があります。 – crush
フォローアップ。 ko.computedは各インスタンスごとに個別に作成する必要があるため、これは望ましくないことに気付きました。 – crush