2015-08-14 1 views
2

J'ai une petite et tout à fait application standard que:EmberJS: est-il possible de sauvegarder uniquement les objets modifiés?

  • objets Récupère du serveur
  • Renders les objets et permet une édition sur eux. S'il est important, cette modification n'affecte que les attributs DS.hasMany.
  • Offre une économie au serveur (il ne doit pas se faire automatiquement, uniquement sur demande de l'utilisateur)

Le contrôleur de l'application gère un événement save, et je stocke les choses. Le code ressemble à ceci:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    actions: { 
     save() { 
      this.store.peekAll('object').forEach(obj => { 
       obj.save(); 
      }); 
     } 
    } 
}); 

Ceci émet une requête PUT pour chaque objet chargé localement. Cela fonctionne bien, mais c'est un peu de force brute. Au lieu de cela, je voudrais enregistrer seulement les objets modifiés.

J'ai essayé avec dirtyType, mais il retourne undefined à l'intérieur de la .forEach, et aussi hasDirtyAttributes, mais il retourne toujours false.

Je pourrais créer mon propre cache d'objets modifiés, mais cela causerait beaucoup de travail et d'erreurs. Existe-t-il un moyen standard de gérer cette situation? Merci d'avance.

Répondre

5

Cela fonctionne très bien:

if(obj.get('hasDirtyAttributes')){ 
    obj.save(); 
} 

JSBin: http://emberjs.jsbin.com/jiqevo/1/edit?html,css,js,output

Modification des relations ne définit pas le modèle aussi sale. Comme une solution de contournement, vous pouvez le régler manuellement, comme ceci:

this.get('model').send('becomeDirty'); 
+0

Salut, ce n'est pas ce dont j'ai besoin. Je pense que cette propriété 'isDirty' est vraie quand un objet n'est pas encore synchronisé avec le magasin local (c'est-à-dire qu'il attend la boucle d'événement). Dans mon cas, lorsque l'utilisateur clique sur Enregistrer, tous les objets ont été synchronisés localement, et 'isDirty' est toujours faux. Ce dont j'ai besoin, c'est de savoir si un objet a été modifié localement depuis le chargement. – bgusach

+0

@ ikaros45 Non c'est définitivement quand l'objet a été modifié. Si vous faites: 'setTimeout (fonction() {if (obj.get ('isDirty')) {console.log (" Je suis sale ");}}, 1000);' l'objet sera toujours sale, c'est-à-dire qu'il est ne pas attendre le eventloop. –

+0

@ ikaros45 La raison pour laquelle vous ne le voyez peut-être pas parce que ember ne supporte pas 'isDirty' sur les relations (pour le moment). http://stackoverflow.com/a/32014670/29347 –