Question

Je chercher un objet JSON à partir du serveur et remplir mon avis. Je change alors les données, repoussez au serveur. Je me suis alors allez chercher une nouvelle copie des données en espérant qu'il me rafraîchir la vue des changements. Cependant, cela ne se produit pas. 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;
}

Cette charge initiale fonctionne très bien. Je fais alors quelqu'un stuff et le changement des poussoirs et que observables retour au serveur de données. Serveur obtient la mise à jour et puis je faire une nouvelle extraction des données afin de vue rafraîchira (je sais que je peux passer en arrière les nouvelles données en une seule étape mais dans le code que je ne l'ai pas encore refondus).

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

Les messages de la console affiche toutes les nouvelles données à revenir, mais mon avis ne les mises à jour.

Était-ce utile?

La solution

Je crois que le problème est à l'ordre des paramètres que vous passez dans la fonction ko.mapping.fromJS lorsque vous mettez à jour contract_model.

Vous avez:

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

vous voulez:

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

Autres conseils

La réponse de

@ seth.miller est correcte. Vous pouvez également laisser le milieu paramètre « options » si votre contract_model est le même que celui qui a été mis en correspondance plus tôt. S'il n'y a que deux arguments, vérifie ko.mapping.fromJS si le second argument possède une propriété "__ko_mapping__". Si oui, il la traite comme une cible, sinon il la traite comme un objet d'options.

Basé sur @ observation de DBueno -. Pour toute personne utilisant tapuscrit Je recommande fortement de commenter cette signature de la méthode de votre fichier knockout.mapping.d.ts

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

Oui -. Tout mettre en commentaire

entrer image description ici

Vous recevrez alors une erreur de compilation si vous essayez de le faire:

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

et vous pouvez le remplacer par le beaucoup plus sûr

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

Safer car si oui ou non item.target a été préalablement tracée (et therfore aurait une propriété __ko_mapping__) il sera toujours copier les propriétés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top