javascript - tutorial - tuto ember js




Ember.js: Rechargement d'une relation.hasMany donnée par des "liens" dans la charge utile (2)

Il y a donc un problème sur GitHub qui n'est pas encore fermé (à ce jour): https://github.com/emberjs/data/issues/1913

Je ne sais pas comment le recharger, mais j'ai pensé que je partagerai la solution de contournement que j'ai faite pour résoudre ce problème.

J'utilise des websockets, donc quand un nouveau post est créé, je l'envoie via websocket et j'utilise les données pour mettre à jour la collection.

Je suis conscient que cela ne résout pas le problème avec Ember Reload, mais je suppose que c'est une solution décente pour les personnes qui utilisent déjà Websockets / Socket.io.

Dis que j'ai deux modèles, Topic et Post :

App.Topic = DS.Model.extend({
  posts: DS.hasMany('post', { async: true, inverse: 'post' });
});

App.Post = DS.Model.extend({
  topic: DS.belongsTo('topic', { async: true });
});

Le sujet a de hasMany messages, et un message belongsTo un sujet.

Pour charger les données de l'API, un appel initial est effectué (qui récupère un sujet ... l'ID de sujet 2 par exemple): GET /topics/2

Après réception de la charge utile pour cette requête GET, le sérialiseur ajoute ensuite une clé de links à la charge utile. Cela a le chemin pour charger les messages associés au sujet:

"topic": {
   "id": 2,
   "links": {
      "posts": "/topics/2/posts"
   }
}

Cette deuxième demande (à /topics/2/posts ) est comment les messages sont chargés et attachés au sujet.

Tout fonctionne correctement lorsque la page est chargée pour la première fois.

Le problème se produit lorsqu'un post est créé au cours d'une session de page . Même si je peux recharger le sujet lui-même (en appelant .reload() sur l'objet modèle qui représente le sujet), les Posts associés au sujet ne sont pas rechargés. Le deuxième appel d'API (pour obtenir les messages) n'est jamais fait, tandis que le premier appel (pour obtenir le sujet) est fait. Si je rafraîchis la page, les articles que j'ai créés sur la page précédente seront chargés (mais bien sûr, si je vais ensuite faire quelques autres posts, ils n'apparaîtront pas avant le chargement de la page suivante).

À la recherche d'une solution, je suis tombé sur cette question: Comment recharger un async avec des liens hasMany relation?

Cependant, il semble que la solution ne fonctionne plus pour les versions actuelles d'Ember / Ember-Data. Le JSFiddle fourni ne fonctionne pas.

Alors, comment puis-je recharger ce genre de relation hasMany? Toute aide est grandement appréciée.


DS.Model.reopen({
  reloadLink: function (linkKey) {
    if ($.isArray(linkKey)) {
      var promises = [];
      for (var i = 0; i < linkKey.length; i++) {
        promises.push(this.reloadLink(linkKey[i]));
      }
      return Em.RSVP.all(promises);
    } else {
      var rel = this._relationships[linkKey];
      if (rel) {
        if (rel.reload) {
          return rel.reload();
        } else if (rel.fetchLink) {
          return rel.fetchLink();
        }
      }
    }
  }
});

Exemple:

model: function () {
    var model = this.modelFor('_some_model_');
    return model.reloadLink(['link1', 'link2']).then(function () {
      return model;
    });
}