マッピングプラグインを使用して、サーバーから送信されるオブジェクトに基づいてクライアントサイドビューモデルを作成しています。オブジェクトは基本的な住所情報、つまり住所1、住所2、市区町村、州、郵便など...計算されたobservableをknockoutjsマッピングに追加する方法
ビューモデルがバインドされたら、ユーザーが住所を変更するとGoogleマップキャンバスを更新します。私は、入力された値をチェックし、マップ更新関数を呼び出す計算された観測値を作成しました。私はマッピングプラグインを使用していなかったとき、つまりモデルがローカルに定義されていたときにこれまで作業していましたが、マッピングを導入すると、計算されたオブザーバブルをビューモデルに追加できませんでした。
マッピングプラグインdocumentationの指示に従って試してみましたが、計算された観測値が更新をトリガーしていません。私は、例のように計算されたobservableを含むmapModelを呼び出すカスタムマッピングを持っていますが、更新はありません。
アイデア?
$.getJSON("@Url.RouteUrl("
ContactUs_default ", new { action = "
GetPageModel ", Model.BusinessID})", function(result) {
//create map property
result.Data.Map = null;
var mapping = {
'Map': {
create: function(options) {
return new mapModel(options.data);
}
}
};
var viewModel = ko.mapping.fromJS(result.Data, mapping);
ko.applyBindings(viewModel);
});
var mapModel = function(data) {
ko.mapping.fromJS(data, {}, this);
this.Map = ko.computed(function() {
var address = "";
var enteredElements = 0;
if (this.Address1 != helpText) {
address += " " + this.Address1;
enteredElements++;
}
if (this.Address2 != helpText) {
address += " " + this.Address2;
}
if (this.City != helpText) {
address += " " + this.City;
enteredElements++;
}
if (this.State != helpText) {
address += " " + this.County;
enteredElements++;
}
if (this.PostalCode != helpText) {
address += " " + this.Postal;
}
alert("hi");
//only upate map if enough data has been entered to give accruate location
if (enteredElements >= 3) {
MYMAP.placeMarkers(address);
}
}, this);
};
この変更を加えましたが、私は "Contact:340Uncaught TypeError:Object [オブジェクトオブジェクト]に計算されたオブザーバブルを指すメソッド 'Address1'"エラーがありません。 – Jerry
クロムjsデバッガのmapModelを見ると、そのプロパティは "Map"と "__ko_mapping__"です。マッピングプラグインによって設定されたモデルの他のプロパティにはどうやってアクセスできますか? – Jerry
ここにあなたのシナリオに近いものを示すために変更することができます:http://jsfiddle.net/rniemeyer/RUsp2/です。私はあなたのデータが正確にどのように見えるか分かりません。結果データに 'Map'プロパティがあるように見えるだけでなく、' Map'計算されたobservableをその子として作成しているようです。 –