6

サーバーからjsonオブジェクトをフェッチし、ビューにデータを入力します。次に、データを変更してサーバーにプッシュバックします。次に、データの新しいコピーをフェッチして、変更を加えてビューを更新することを期待します。しかし、それは起こりません。TIA

$(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);
        };
    });
}

コンソールメッセージはすべて、新しいデータが戻ってくることを示していますが、私のビューは更新されません。

4

3 に答える 3

21

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

あなたが持っている:

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

あなたが欲しい:

ko.mapping.fromJS(data, {}, contract_model);
于 2012-02-16T02:42:02.877 に答える
3

@seth.millerの答えは正しいです。contract_model以前にマップされたものと同じである場合は、中央の「options」パラメーターを省略できます。引数が2つしかないko.mapping.fromJS場合は、2番目の引数にプロパティがあるかどうかを確認し"__ko_mapping__"ます。その場合はターゲットとして扱い、そうでない場合はオプションオブジェクトとして扱います。

于 2012-12-11T16:06:11.460 に答える
1

@DBuenoの観察に基づいて、typescriptを使用している人は、ファイルからこのメソッドシグネチャをコメントアウトすることを強くお勧めしknockout.mapping.d.tsます。

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

はい-コメントアウトするだけです。

ここに画像の説明を入力してください

次に実行しようとすると、コンパイル時エラーが発生します。

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

そしてあなたはそれをはるかに安全なものと交換することができます

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

item.target以前にマップされているかどうか(したがってプロパティがあるかどうか__ko_mapping__)に関係なく、常にプロパティがコピーされるため、より安全です。

于 2015-05-13T06:52:40.797 に答える