41 votes

Mise en cache de données distantes dans le stockage local avec EmberData

J'ai une question sur le chargement et la mise en cache d'objets distants avec Ember. Je développe une application Ember qui utilise le stockage côté serveur via une API REST. Certaines des données récupérées changent rarement, il est donc inutile de les récupérer sur le serveur à chaque chargement de l'application. Mais c'est aussi une question pour les applications qui doivent fonctionner hors ligne et qui enregistrent quand même leurs données sur un serveur.

Ember Data dispose d'un adaptateur de stockage intégré pour la persistance des modèles par le biais d'une API REST. un adaptateur pour le stockage local également (comme l'a souligné Ken ci-dessous). Le problème (si c'est un problème) est qu'un modèle n'a qu'un seul adaptateur de stockage, et il ne semble pas y avoir de concept de mise en cache des modèles récupérés autre que de les garder en mémoire.

J'ai trouvé des demandes similaires dans ce Liste de souhaits d'Ember et dans les commentaires de cet article discours de Tom Dale mais je n'ai pas trouvé d'indication que ce serait une fonctionnalité existante dans Ember.

J'ai deux questions (la première étant la plus importante) :

  1. Quelle est la meilleure façon - aujourd'hui - de mettre en œuvre des modèles en cache dans le stockage local et de les synchroniser avec des données distantes selon les besoins ?
  2. S'agit-il d'une fonctionnalité qu'il est prévu d'inclure dans Ember, ou du moins quelque chose que les mainteneurs estiment devoir être ajouté à terme ?

En ce qui concerne le point 1), je peux penser à plusieurs stratégies :

a) Étendre un adaptateur existant et ajouter un mécanisme de synchronisation à distance personnalisé :

App.Store.registerAdapter('App.Post', DS.LSAdapter.extend({
  // do stuff when stuff happens
}));

b) Maintenir des classes de modèles distinctes - un ensemble pour les objets distants, et un ensemble pour les objets locaux - et synchroniser entre elles si nécessaire. Avec le cas standard Todo :

RemoteTodo –*sync*– Todo
                     |
                     UI

J'espère que c'est une question de débutant et qu'il existe un modèle bien établi pour cela.

Mis à jour : Trouvé cette question similaire . Il y a une bonne réponse, mais c'est un peu théorique. Je pense que j'aurais besoin de conseils pratiques ou de pointeurs vers des exemples de mise en œuvre.

5voto

Black Points 41

Je souhaite juste faire remonter un peu ce fil de discussion, parce qu'il était l'un des premiers résultats lorsque j'ai cherché des solutions pour le cache local ember, l'api restful, etc :

Dan Gebhardt semble faire un sacré bon travail avec Orbit.js et son intégration dans Ember : https://github.com/orbitjs/ember-orbit

Orbit est une bibliothèque autonome permettant de coordonner l'accès aux sources de données et en gardant leur contenu synchronisé .

Orbit fournit une base pour la création de fonctionnalités avancées dans des avancées dans les applications côté client, comme le fonctionnement hors ligne l'entretien et la synchronisation des caches locaux, les piles undo/redo et les contextes d'édition ad hoc. les contextes.

Caractéristiques d'Orbit.js :

  • Prendre en charge un nombre illimité de sources de données différentes dans une application et leur fournir un accès par le biais d'interfaces communes.

  • Permettre l'exécution des demandes par différentes sources, y compris la possibilité de spécifier des plans de priorité et de repli.

  • Permettre aux documents d'exister simultanément dans différents états à travers les sources.

  • Coordonner les transformations entre les sources. Gérer les fusions automatiquement lorsque cela est possible, mais permettre un contrôle personnalisé complet.

  • Permettre des transformations bloquantes et non bloquantes.

  • Permettre les demandes synchrones et asynchrones.

  • Prise en charge des transactions et de l'annulation/rétablissement par le suivi des inverses des opérations.

  • Travaillez avec des objets JavaScript simples.

Et ne manquez pas son excellent discours et ses diapositives sur Orbit :
Introduction à Orbit.js

( UPDATE : J'ai ajouté des informations plus descriptives des pages d'Orbit, car mon message a été déclassé pour avoir "juste" référencé des ressources externes et ne pas contenir la solution réelle en soi. Mais Orbit me semble être la solution, et la seule façon d'"inclure" ceci ici est via des liens).

3voto

ken Points 2086

Il existe une implémentation d'un adaptateur de stockage local qui pourrait vous être utile. Jetez un coup d'œil à https://github.com/rpflorence/ember-localstorage-adapter

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X