Pregunta

Obtengo un objeto JSON desde el servidor y pueblo mi vista. Luego cambio los datos, lo presiono al servidor. Luego busco una nueva copia de los datos con la esperanza de que actualice mi vista con cualquier cambio. Sin embargo, eso no sucede. 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;
}

Esta carga inicial funciona bien. Luego hago algunas cosas y cambio una de las observables y empujé esos datos al servidor. El servidor obtiene la actualización y luego hago una nueva obtención de datos para que la vista se actualice (sé que puedo dejar atrás los nuevos datos en un solo paso, pero esto en el código aún no he refactorado).

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

Todos los mensajes de la consola muestran que los nuevos datos regresan, pero mi vista nunca se actualiza.

¿Fue útil?

Solución

Creo que el problema es con el orden de los parámetros que pasa a la ko.mapping.fromJS función cuando está actualizando contract_model.

Tú tienes:

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

usted quiere:

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

Otros consejos

@Seth.miller La respuesta es correcta. También puede dejar de lado el parámetro de "opciones" del medio si su contract_model es el mismo que fue mapeado antes. Si solo hay dos argumentos, ko.mapping.fromJS comprobaciones si el segundo argumento tiene un "__ko_mapping__" propiedad. Si es así, lo trata como un objetivo, de lo contrario lo trata como un objeto de opciones.

Basado en la observación de @dbueno: para cualquier persona que use TypeScript, recomiendo encarecidamente comentar esta firma de método de su knockout.mapping.d.ts expediente.

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

Sí, solo comenta.

enter image description here

Luego obtendrá un error de tiempo de compilación si intenta hacer:

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

y puedes reemplazarlo con el mucho más seguro

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

Más seguro porque si item.target ha sido mapeado previamente (y por lo tanto tendría un __ko_mapping__ propiedad) siempre copiará las propiedades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top