Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
richclient:emberjs:data:crud [2018/02/04 16:32] – [1 enregistrement] jcheron | richclient:emberjs:data:crud [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 11: | Ligne 11: | ||
- | ===== Read : recherche | + | ===== Read : chargement |
==== 1 enregistrement ==== | ==== 1 enregistrement ==== | ||
Ligne 20: | Ligne 20: | ||
</ | </ | ||
- | Recherche d'une instance de person déjà chargée (ne retourne que si elle est déjà présente dans le store, sans effectuer de requête vers le serveur) : | + | Recherche d'une instance de **person** déjà chargée (ne retourne que si elle est déjà présente dans le store, sans effectuer de requête vers le serveur) : |
<sxh javascript> | <sxh javascript> | ||
let person = this.get(' | let person = this.get(' | ||
Ligne 26: | Ligne 26: | ||
+ | ==== Plusieurs enregistrements ==== | ||
+ | Chargement de toutes les instances de **person** : | ||
+ | <sxh javascript> | ||
+ | let persons = this.get(' | ||
+ | </ | ||
+ | |||
+ | Retour des instances de **person** déjà chargée dans le store : | ||
+ | <sxh javascript> | ||
+ | let persons = this.get(' | ||
+ | </ | ||
+ | |||
+ | ==== Recherche par critères ==== | ||
+ | |||
+ | De plusieurs enregistrements | ||
+ | |||
+ | <sxh javascript> | ||
+ | this.get(' | ||
+ | filter: { | ||
+ | name: ' | ||
+ | } | ||
+ | }).then(function(peters) { | ||
+ | // Do something with `peters` | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | D'un seul enregistrement | ||
+ | |||
+ | <sxh javascript> | ||
+ | this.get(' | ||
+ | filter: { | ||
+ | id: 1234 | ||
+ | } | ||
+ | }).then(function(user) { | ||
+ | // Do something with `user` | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | ===== Create ===== | ||
+ | Toutes les opérations de modification (ajout, modification, | ||
+ | * Réalisation de la modification (appel de createRecord, | ||
+ | * Mise à jour sur le serveur (save) | ||
+ | |||
+ | Création d'une instance | ||
+ | |||
+ | <sxh javascript> | ||
+ | let post = store.createRecord(' | ||
+ | title: 'Rails is Omakase', | ||
+ | body: 'Lorem ipsum' | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | Mise à jour de la création (persistance) : | ||
+ | |||
+ | <sxh javascript> | ||
+ | post.save(); | ||
+ | </ | ||
+ | |||
+ | ===== Update ===== | ||
+ | |||
+ | Mise à jour de l' | ||
+ | <sxh javascript> | ||
+ | this.get(' | ||
+ | // ...after the record has loaded | ||
+ | tyrion.set(' | ||
+ | tyrion.save(); | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | ===== Delete===== | ||
+ | |||
+ | Suppression d'une instance et persistance : | ||
+ | <sxh javascript> | ||
+ | post.deleteRecord(); | ||
+ | post.get(' | ||
+ | post.save(); | ||
+ | </ | ||
+ | |||
+ | Il est possible d' | ||
+ | <sxh javascript> | ||
+ | post.destroyRecord(); | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Flags, dirty attributes et annulation ===== | ||
+ | |||
+ | Tant que la méthode **save** n'est pas appelée, la persistance n'est pas réalisée, et les instances modifiées portent les flags mentionnant leurs modifications : | ||
+ | * isDirty | ||
+ | * isDeleted | ||
+ | * isNew | ||
+ | |||
+ | <sxh javascript> | ||
+ | person.get(' | ||
+ | person.get(' | ||
+ | person.set(' | ||
+ | person.get(' | ||
+ | person.changedAttributes(); | ||
+ | </ | ||
+ | |||
+ | Il est possible d' | ||
+ | |||
+ | <sxh javascript> | ||
+ | person.get(' | ||
+ | person.changedAttributes(); | ||
+ | |||
+ | person.rollbackAttributes(); | ||
+ | |||
+ | person.get(' | ||
+ | person.get(' | ||
+ | person.changedAttributes(); | ||
+ | </ | ||
+ | |||
+ | ===== Erreurs de validation ===== | ||
+ | |||
+ | Côté router, il est possible d' | ||
+ | |||
+ | <sxh javascript> | ||
+ | import Route from ' | ||
+ | |||
+ | export default Route.extend({ | ||
+ | model(params) { | ||
+ | return this.get(' | ||
+ | }, | ||
+ | |||
+ | actions: { | ||
+ | error(error, | ||
+ | if (error.status === ' | ||
+ | this.replaceWith(' | ||
+ | } else { | ||
+ | // Let the route above this handle the error. | ||
+ | return true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | |||
+ | Si le serveur retourne des erreurs de validation au moment du save, la propriété **errors** du model permet de les afficher : | ||
+ | |||
+ | <sxh html> | ||
+ | {{#each post.errors.title as |error|}} | ||
+ | <div class=" | ||
+ | {{/each}} | ||
+ | {{#each post.errors.body as |error|}} | ||
+ | <div class=" | ||
+ | {{/each}} | ||
+ | </ | ||
+ | |||
+ | |||
+ | Il existe également un **loading event** permettant d' | ||
+ | |||
+ | <sxh javascript> | ||
+ | import Route from ' | ||
+ | |||
+ | export default Route.extend({ | ||
+ | ... | ||
+ | actions: { | ||
+ | loading(transition) { | ||
+ | let start = new Date(); | ||
+ | transition.promise.finally(() => { | ||
+ | this.get(' | ||
+ | }); | ||
+ | |||
+ | return true; | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
===== Promises ===== | ===== Promises ===== | ||
+ | |||
+ | Toutes les méthodes du store interrogeant le serveur (find, findAll, query, save...) retournent une " | ||
+ | |||
+ | <sxh javascript> | ||
+ | let persons=this.get(' | ||
+ | //les données datas sont chargées | ||
+ | }).catch(function(reason){ | ||
+ | //Erreurs de chargement | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | <sxh javascript> | ||
+ | let post = store.createRecord(' | ||
+ | title: 'Rails is Omakase', | ||
+ | body: 'Lorem ipsum' | ||
+ | }); | ||
+ | |||
+ | let self = this; | ||
+ | |||
+ | function transitionToPost(post) { | ||
+ | self.transitionToRoute(' | ||
+ | } | ||
+ | |||
+ | function failure(reason) { | ||
+ | // handle the error | ||
+ | } | ||
+ | |||
+ | post.save().then(transitionToPost).catch(failure); | ||
+ | </ | ||