Ember.js: herladen van een .hasMany-relatie gegeven via “links” in payload

Stel dat ik twee modellen heb, Topicen 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 });
});

Topic hasManyPosts, en een Post belongsToeen Topic.

Om de gegevens van de API te laden, wordt één eerste aanroep gedaan (die bijvoorbeeld een onderwerp… onderwerp-ID 2 ophaalt):
GET /topics/2

Na ontvangst van de payload voor dit GET-verzoek, voegt de serializer een sleutel linkstoe aan de payload. Dit heeft de route om de berichten te laden die bij het onderwerp horen:

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

Dit tweede verzoek (naar /topics/2/posts) is hoe de berichten worden geladen en aan het onderwerp worden toegevoegd.

Dit werkt allemaal prima wanneer de pagina voor het eerst wordt geladen.

Het probleem doet zich voor wanneer een bericht wordt gemaakt tijdens een paginasessie. Hoewel ik het onderwerp zelf kan laten herladen (door .reload()aan te roepen op het modelobject dat het onderwerp vertegenwoordigt), zijn de Postsdie aan het onderwerp zijn gekoppeld nietopnieuw geladen. De tweede API-aanroep (om de berichten te krijgen) wordt zelfs nooit gedaan, terwijl de eerste aanroep (om alleen het onderwerp te krijgen) wordtgedaan. Als ik de pagina vernieuw, worden de berichten die ik op de vorige pagina heb gemaakt, geladen (maar natuurlijk, als ik dan nog meer berichten ga maken, verschijnen ze pas bij het laden van de volgende pagina).

Op zoek naar een oplossing kwam ik deze vraag tegen:
Hoe herlaad ik een async met links hasMany-relatie?

Het lijkt er echter op dat de oplossing niet meer werkt voor de huidige versies van Ember/Ember-Data. De geleverde JSFiddle werkt niet.

Dus, hoe kan ik dit soort hasMany-relaties opnieuw laden?Alle hulp wordt zeer op prijs gesteld.


Antwoord 1, autoriteit 100%

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();
        }
      }
    }
  }
});

Voorbeeld:

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

Antwoord 2, autoriteit 50%

Er is dus een probleem op GitHub dat nog niet is gesloten (vanaf vandaag): https: //github.com/emberjs/data/issues/1913

Ik weet niet hoe ik het opnieuw moet laden, maar ik dacht dat ik de tijdelijke oplossing die ik heb gedaan om dit probleem op te lossen, zal delen.

Ik gebruik websockets, dus wanneer er een nieuw bericht wordt gemaakt, stuur ik het gewoon via websocket en gebruik de gegevens om de collectie bij te werken.

Ik ben me ervan bewust dat dit het probleem met Ember Reload niet oplost, maar ik denk dat dit een goede oplossing is voor de mensen die Websockets / Socket.io al gebruiken.

Other episodes