ventajas tutorial guide example español emberjs ember docs desventajas app ember.js ember-data

ember.js - tutorial - ventajas de emberjs



Cómo configurar manualmente el estado de un objeto para limpiarlo(guardado) usando Ember-Data (11)

A partir de 1.0.0.rc6.2 ....

Esto moverá un modelo al estado de un modelo que se ha guardado.

record.get(''stateManager'').transitionTo(''loaded.saved'')

Esto moverá un modelo al estado de un nuevo modelo que no se haya comprometido. Piensa en un nuevo modelo sucio.

record.get(''stateManager'').transitionTo(''loaded.created.uncommitted'')

Esto moverá un modelo al estado de un modelo antiguo que se ha actualizado, piense en el antiguo modelo sucio:

record.get(''stateManager'').transitionTo(''loaded.updated'')

Explicación:

Estoy usando data-ember para un proyecto mío y tengo una pregunta que gira en torno a la posibilidad de ensuciar un objeto y luego establecer su estado para que se limpie nuevamente a propósito, sin comprometer los cambios. El escenario es este:

Supongamos que he buscado un objeto a través de banana = App.Fruit.find(''banana''); y tiene una descripción de "fruta amarilla". Usando XHR long-polling (o WebSockets), puedo recibir una versión actualizada del objeto porque otro usuario ha cambiado la descripción a "¡Una sabrosa fruta amarilla!" en cualquier punto dado en el tiempo después de que tomé el objeto original.

Entonces, lo que me gustaría hacer es actualizar el objeto para reflejar los datos recién recibidos. Para esto, he intentado diferentes enfoques:

  • Intenté llamar a App.Store.load(App.Fruit, new_data); . En primer lugar, este enfoque no funciona y, en segundo lugar, esto no es realmente lo que quiero. Pude haber realizado cambios no comprometidos en el objeto y, en este caso, no sería deseable descartarlos (suponiendo que la llamada a load() los sobreescribiría).

  • Intenté recorrer los nuevos datos, llamando a .set() , como por banana.set(''description'', new_data.description); : banana.set(''description'', new_data.description); - para actualizar las propiedades del objeto con los nuevos datos (si corresponde = no sucio). Esto funciona pero deja el objeto en un estado sucio.

Para hacer que el objeto esté limpio / actualizado nuevamente, y no tener el adaptador, ¡comprométalo! - He echado un vistazo a los estados por los que viaja el objeto. Estos son (al menos):

  • Paso 1: Inicialmente, el objeto está en el estado rootState.loaded.saved .
  • Paso 2: Llamar .set() en una propiedad lo empuja al estado rootState.loaded.updated.uncommitted .
  • Paso 3: Llamar a App.store.commit(); devuelve el objeto al estado rootState.loaded.saved .

Por lo tanto, he intentado configurar manualmente el estado del objeto para que se saved después del paso 2, como por banana.get(''stateManager'').goToState(''saved''); : banana.get(''stateManager'').goToState(''saved''); .

Sin embargo, esto no funciona. La próxima vez que la tienda se comprometa por cualquier otro motivo, esta maniobra produce un error inFlightDirtyReasons undefined .

Pregunta:

Mi pregunta es: ¿cómo puedo cambiar manualmente el estado de un objeto sucio para limpiar (guardar) de nuevo?


A partir de ember-data 1.0.0-beta.12:

record.transitionTo(''loaded.saved'');

Parece que record.get(''stateManager'') ya no es necesario.


En cuanto a los datos de las brasas, el estado no confirmado tiene un evento ''becomeClean'' que, en consecuencia, establece el registro como loaded.saved.

Esto debería funcionar

record.get(''stateManager'').send(''becameClean'');


Es una actualización de la solución de @Kamil-j.

Para Ember Data 2.0 que estoy usando, debo hacer lo siguiente:

record._internalModel.send(''willCommit''); record._internalModel._attributes = {}; record._internalModel.send(''didCommit'');


Esto es lo que parece funcionar para Ember Data 1.0.0-beta.10:

record.set(''currentState.stateName'', ''root.loaded.saved''); record.adapterWillCommit(); record.adapterDidCommit(); record.set(''currentState.isDirty'', false);

No estoy seguro de si se requieren todas esas líneas, sino simplemente de lo que otros han hecho antes de esto.



Parece que con las versiones más nuevas, todo lo que aquí se menciona se rompió.

Esto funcionó para mí con ember-data 1.0.0.beta4:

record.adapterWillCommit(); record.adapterDidCommit();


Solución para Ember Data 1.0.0-beta.7 :

// changing to loaded.updated.inFlight, which has "didCommit" record.send(''willCommit''); // clear array of changed (dirty) model attributes record.set(''_attributes'', {}); // changing to loaded.saved (hooks didCommit event in "inFlight" state) record.send(''didCommit'');

He buscado el código fuente de Ember-data y he encontrado que el estado loaded.saved tiene una función de configuración que verifica si un modelo está limpio, antes de configurar el estado "guardado". Si no está limpio, rechaza una solicitud para cambiar el estado y vuelve a loaded.updated.uncommitted.

Por lo tanto, debe limpiar model._attributes array, que conserva los nombres de atributos y Ember le permitirá cambiar el estado manualmente.

Sé que no es una solución muy buena, porque es necesaria para establecer la propiedad privada de un modelo, pero aún no he encontrado otras soluciones.



Ember 2.9.1

record.set(''currentState.isDirty'', false);


Probado en Ember Data 2.9

La acción de pushData es el camino a seguir, pero además de eso, los "valores originales" deben reiniciarse también.

Ember.assign(record.data, record._internalModel._attributes); Ember.assign(record._internalModel._data, record._internalModel._attributes); record.send(''pushedData'');