2012-04-11 20 views
4

マッピングプラグインを使用して、サーバーから送信されるオブジェクトに基づいてクライアントサイドビューモデルを作成しています。オブジェクトは基本的な住所情報、つまり住所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); 
};​ 

答えて

2

マッピングプラグインを使用してデータを送信すると、すべてのプロパティが観測可能になります。

これはあなたのようなのような関数としてそれらにアクセスする必要があることを意味します

if (this.Address1() != helpText) { 
     address += " " + this.Address1(); 
     enteredElements++; 
    } 

あなたが計算された観測の内部観測としてそれらにアクセスすると、それが依存関係を作成します。したがって、現在計算された観測値は最初に評価されますが、観測値の値にはアクセスしないため、再度更新されることはありません。

+0

この変更を加えましたが、私は "Contact:340Uncaught TypeError:Object [オブジェクトオブジェクト]に計算されたオブザーバブルを指すメソッド 'Address1'"エラーがありません。 – Jerry

+0

クロムjsデバッガのmapModelを見ると、そのプロパティは "Map"と "__ko_mapping__"です。マッピングプラグインによって設定されたモデルの他のプロパティにはどうやってアクセスできますか? – Jerry

+2

ここにあなたのシナリオに近いものを示すために変更することができます:http://jsfiddle.net/rniemeyer/RUsp2/です。私はあなたのデータが正確にどのように見えるか分かりません。結果データに 'Map'プロパティがあるように見えるだけでなく、' Map'計算されたobservableをその子として作成しているようです。 –

関連する問題