2011-12-28 7 views

Respuesta

15

Aquí está una post sobre la creación de una bandera sucia en Knockout que hará un seguimiento de los cambios en todos los observables en un objeto.

Normalmente, debe agregar una bandera sucia a cada elemento en su matriz en una función de constructor o recorrer cada elemento y agregar el indicador. Luego, puede crear un observable calculado para representar solo los elementos modificados para enviar de vuelta al servidor.

Aquí es un ejemplo que muestra una bandera sucia en cada artículo y un observables computarizada que contiene sólo los elementos sucios: http://jsfiddle.net/rniemeyer/wauwn/

+0

su solución es perfecta. ¿Pensaste en enviar este ko.dirtyFlag al equipo ko? –

+0

Estoy en el equipo central de ko (solo 3 personas con Steve Sanderson el desarrollador primario). El pensamiento actual es generalmente mantener el núcleo apretado y poner cosas como esta en complementos. Sin embargo, podría considerar poner esto como un proyecto apropiado. –

2

No es una tarea tan trivial como puede parecer.

Al principio, la matriz observable solo maneja la modificación de array (insertar, eliminar, reordenar, etc.) no la modificación del elemento.

En segundo lugar, es probable que necesite un indicador especial como 'isModified' en su modelo que se une a cada fila de la tabla.

Luego debe establecer ese indicador si parte del enlace se actualizó. Knockoutjs observables proporciona un método de suscripción que permite llamar a su propia función cuando se actualiza observables. Eche un vistazo a la página http://knockoutjs.com/documentation/observables.html en la parte inferior hay una sección llamada 'suscribirse explícitamente a observables'.

Hay un proyecto rápido de código que realiza esa tarea

function CreateArrayElementViewModel(inputData) { 
    // Creating our view model 
    var result = { 
      prop : ko.observable(inputData.prop), 
      val : ko.observable(inputData.val), 
      isModified: false // This property would be true if entity was edited 
    };  
    // Iterate over all properties and subscribe to knockoutjs observables 
    for(prop in result) { 
      if (typeof(result[prop].subscribe) != 'undefined') { 
       result[prop].subscribe(function() { result.isModified = true; }); 
      } 
    } 

    return result; 
} 
+0

Compruebe que suscribirse es una función para estar seguro, que ahora sólo está probando que existe una propiedad . La prueba debe ser: 'result.hasOwnProperty (prop) && typeof result [prop] ===" function "' – froginvasion

Cuestiones relacionadas