Ember JS, Erreur lors de l'analyse des données dans Transformer handeling event `didCommit` dans state root.loaded.updated.uncommitted."

Je reçois une erreur dans un Transformer Ember essayant d'analyser une date dans la fonction de sérialisation.

Message d'erreur: "Tentative de gérer l'événement didCommit sur <(sous-classe de DS.Model): ember1597: 8260357> dans l'état root.loaded.updated.uncommitted."

Curieusement, les données sont transmises correctement analysées sur le serveur.

Code:

 DS.Transform.extend({ deserialize : function(serialized) { var array = []; if (Ember.isArray(serialized)) { serialized.forEach(function(item) { if (item.feldTyp === "DATE_FIELD" && item.value) { Ember.set(item, "value", moment(item.value, "DD.MM.YYYY")); } array.addObject(Ember.Object.create(item)); }); } return array; }, serialize : function(deserialized) { if (Ember.isArray(deserialized)) { deserialized.forEach(function(item) { if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) { item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); } }); return deserialized; } return []; } }); 

L' item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); Provoque l'erreur comme l'a expliqué l'erreur disparaît. J'ai essayé d'autres choses comme la définition d'une valeur statique ou le réglage de la valeur en utilisant Ember.set mais sans succès. Je ne sais pas très bien ce qui s'est mal passé ici et ne peut donc pas penser à une solution. Quelqu'un peut-il aider? Merci d'avance.

modifier

Solution de contournement: j'ai déplacé la sérialisation dans le contrôleur. Ne regarde pas comme élégant mais travaille pour l'instant …

Comme vous l'avez compris, les données de braille n'aiment pas l'utilisation de l' set de ses transformations. Parce que la représentation du serveur des données est souvent différente de la façon dont elle est représentée du côté client. Ember s'attend à transformer pour ne pas modifier les valeurs serialized ou deserialized qui sont passées et à la place de renvoyer de nouvelles valeurs.

La raison pour laquelle cette erreur se produit est parce que Ember possède une machine d'état pour suivre l'état d'un enregistrement par rapport au serveur (voir http://emberjs.com/api/data/classes/DS.RootState.html ). Dans ce cas, le brouillard est très probablement en train de mettre l'enregistrement dans l'état inFlight . Il appelle ensuite la fonction de sérialisation de la transformation. Lorsque item.set s'appelle ember remarque une modification de l'enregistrement et transforme par inadvertance l'enregistrement dans l'état uncommitted . Une fois que le serveur répond à la requête de sauvegarde, assume à tort que l'enregistrement est toujours dans les signaux d'état didCommit événement didCommit afin que l'enregistrement puisse passer à l'état saved . Étant donné que l'état uncommitted ne prend pas en charge l' didCommit événement didCommit , il didCommit une erreur.

Je soupçonne que vous pourriez résoudre ce problème en réécrivant votre fonction de sérialisation pour ne pas appeler set et plutôt pour renvoyer un nouveau tableau.

  serialize : function(deserialized) { if (Ember.isArray(deserialized)) { return deserialized.map(function(item) { if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) { return moment(item.get('value')).format("DD.MM.YYYY"); } }); } return []; }