2012-02-16 8 views
6

Busco un objeto json del servidor y llento mi vista. Luego cambio los datos, los vuelvo a enviar 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. TIAKnockout.js ko.mapping.toJS no refrescando datos en mi vista

$(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 uno de los observables y vuelvo a enviar esos datos al servidor. El servidor recibe la actualización y luego hago una nueva búsqueda de los datos para que la vista se actualice (sé que puedo pasar los datos nuevos en un solo paso, pero esto en código no lo he refabricado todavía).

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 los nuevos datos que regresan pero mi vista nunca se actualiza.

Respuesta

20

Creo que el problema está en el orden de los parámetros que pasa a la función ko.mapping.fromJS al actualizar contract_model.

tiene:

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

que desee:

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

Los documentos KnockOut para el plugin Mapping son, IMO, incorrectos en la sintaxis para llamar a ko.mapping.fromJS (...). Los documentos muestran lo siguiente: ko.mapping.fromJS (data, viewModel), pero claramente esto debería ser: ko.mapping.fromJS (data, {}, viewModel) –

+1

Pasaron horas en esto. Gracias, fue una gran ayuda. –

+0

También pasé horas en esto. Te debo un paquete de seis – stackoverfloweth

2

@ respuesta de seth.miller es correcta. También puede omitir el parámetro "opciones" del medio si su contract_model es el mismo que se asignó anteriormente. Si solo hay dos argumentos, ko.mapping.fromJS comprueba si el segundo argumento tiene una propiedad "__ko_mapping__". Si es así, lo trata como un objetivo, de lo contrario lo trata como un objeto de opciones.

+0

Ugh esto es tonto. Si el segundo argumento no tiene la propiedad '" __ko_mapping __ "' y el tercer argumento no existe, entonces debería tratar el segundo argumento como el objetivo. –

0

Basado en la observación de @ DBueno: para cualquier persona que use mecanografiado, recomiendo encarecidamente comentar esta sobrecarga en particular de su archivo knockout.mapping.d.ts.

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

enter image description here

A continuación, obtiene un error de tiempo de compilación si se intenta hacer:

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

y puede sustituirlo por el mucho más seguro

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

Más seguro porque se ha mapeado o no item.target anteriormente (y por lo tanto h tiene una propiedad __ko_mapping__) siempre copiará las propiedades.

Cuestiones relacionadas