Frage

Ich hole ein JSON -Objekt vom Server und fülle meine Ansicht. Ich ändere dann die Daten und drücke sie zurück auf den Server. Ich hole dann eine neue Kopie der Daten in der Hoffnung, dass sie meine Ansicht mit allen Änderungen aktualisiert. Das passiert jedoch nicht. 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;
}

Diese anfängliche Last funktioniert einwandfrei. Ich mache dann ein paar Sachen und ändere eines der Observablen und schiebe diese Daten zurück auf den Server. Der Server erhält das Update und dann mache ich einen neuen Abruf der Daten, damit diese Ansicht aktualisiert wird (ich weiß, dass ich die neuen Daten in einem Schritt zurückgeben kann, aber in Code, den ich noch nicht neu gestellt habe).

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

Die Konsolennachrichten zeigen alle die neuen Daten, die zurückkommen, aber meine Ansicht aktualisiert nie.

War es hilfreich?

Lösung

Ich glaube, das Problem liegt in der Reihenfolge der Parameter, die Sie in die übergeben ko.mapping.fromJS Funktion beim Aktualisieren contract_model.

Du hast:

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

Sie wollen:

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

Andere Tipps

@Seth.Millers Antwort ist korrekt. Sie können auch den Parameter der mittleren "Optionen" auslassen, wenn Ihre contract_model ist dasselbe, was früher zugeordnet wurde. Wenn es nur zwei Argumente gibt, ko.mapping.fromJS Überprüft, ob das zweite Argument a hat "__ko_mapping__" Eigentum. In diesem Fall behandelt es es als Ziel, sonst behandelt es es als Optionsobjekt.

Basierend auf der Beobachtung von @dbueno - für alle, die TypeScript verwenden, empfehle ich dringend, diese Methodensignatur von Ihrem zu kommentieren knockout.mapping.d.ts Datei.

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

Ja - kommentieren Sie es einfach.

enter image description here

Sie erhalten dann einen Kompilierzeitfehler, wenn Sie versuchen zu tun:

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

und Sie können es durch viel sicherer ersetzen

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

Sicherer, ob ob oder nicht item.target wurde zuvor zugeordnet (und hätte daher eine __ko_mapping__ Eigenschaft) es wird immer die Eigenschaften kopieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top