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 []; }