2012-02-16 16 views
6

サーバーからjsonオブジェクトを取得して、ビューにデータを取り込みます。その後、データを変更してサーバーに戻します。私は、データの新しいコピーを取得し、変更を加えて自分のビューを更新することを望みます。しかし、それは起こりません。 TIAKnockout.js ko.mapping.toJSビュー内のデータを更新しません。

$(document).ready(function() { 
    var customer_id = get_customer_id(); 
    var data = load_model(); 
    contract_model = ko.mapping.fromJS(data,{}); 
    ko.applyBindings(contract_model); 
} 

function load_model(){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    var data = ''; 
    $.ajax({ 
     type:'GET', 
     url:url, 
     async:false, 
     success: function(returningValue){ 
      data = returningValue; 
     } 
    }); 
    return data; 
} 

この初期ロードは正常に機能します。私はいくつかのことを行い、観測値の1つを変更し、そのデータをサーバーに戻します。サーバーが更新を取得した後、新しいビューを更新するようにデータの新しい取得を行います(新しいデータを1ステップで返すことができますが、これはコードではまだリファクタリングしていません)。

function refresh_data(contract_model){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    $.post(url,function(data){ 
     console.log(data); 
     ko.mapping.fromJS(contract_model,{},data); 
     ko.applyBindings(contract_model); 
     console.log(ko.mapping.toJS(contract_model)) 
    }); 

} 

function refresh_data(contract_model){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    $.post(url,function(data){ 
     console.log(data); 
     ko.mapping.fromJS(contract_model,{},data); 
     console.log(ko.mapping.toJS(contract_model)) 
    }); 

} 

function push_model(contract_model,refresh){ 
    var url = '/ar/update_contract'; 
    var data = {'contract':ko.mapping.toJSON(contract_model)} 

    delete data['lines']; 
    $.post(url,data,function(return_value){ 
     if (refresh){ 
      refresh_data(contract_model); 
     }; 
    }); 
} 

コンソールメッセージには新しいデータが戻ってきますが、私のビューは更新されません。

答えて

20

contract_modelを更新するときに、ko.mapping.fromJS関数に渡すパラメータの順序に問題があると思います。

あなたが持っている:

ko.mapping.fromJS(contract_model,{},data); 

したい:seth.millerの答え@

ko.mapping.fromJS(data, {}, contract_model); 
+12

マッピングプラグインのKnockOutドキュメントは、IMOで、ko.mapping.fromJS(...)を呼び出す構文が間違っています。 ko.mapping.fromJS(data、viewModel)、明らかにこれは次のようにする必要があります。ko.mapping.fromJS(data、{}、viewModel) –

+1

これに費やされた時間。ありがとう、これは大きな助けでした。 –

+0

私もこれに数時間を費やしました。私はあなたに6つのパックを借りている – stackoverfloweth

2

は正しいです。 contract_modelが以前マップされたものと同じものである場合は、中間の「オプション」パラメータを省略することもできます。引数が2つだけの場合、ko.mapping.fromJSは第2引数に"__ko_mapping__"プロパティがあるかどうかをチェックします。そうであれば、それをターゲットとして扱います。そうでなければ、それをオプションオブジェクトとして扱います。

+0

これはダムです。 2番目の引数に '' __ko_mapping __ "'プロパティがなく、3番目の引数が存在しない場合は、実際に2番目の引数をターゲットとして扱うべきです。 –

0

@ DBuenoの観察に基づいて、typescriptを使用している人は、knockout.mapping.d.tsファイルからこの特定のオーバーロードをコメントアウトすることを強くお勧めします。

fromJS(jsObject: any, targetOrOptions: any): any; 

enter image description here

あなたがしようとすると、コンパイル時エラーが発生します:

ko.mapping.fromJS(item.data, item.target); 

を、あなたがはるかに安全に置き換えることができ

ko.mapping.fromJS(item.data, {}, item.target); 

item.targetが以前にマップされているかどうかで安全ですave a __ko_mapping__プロパティ)は常にプロパティをコピーします。

関連する問題