tutorial template examples ember data blog javascript ember.js ember-data

javascript - template - ember tutorial



Ember.js: volver a cargar una relación.hasMany dado a través de “enlaces” en la carga útil (2)

Entonces, hay un problema en GitHub que aún no está cerrado (A partir de hoy): https://github.com/emberjs/data/issues/1913

No sé cómo hacerlo volver a cargar, pero pensé que compartiré la solución alternativa que hice para resolver este problema.

Estoy usando websockets, así que cuando alguna vez se crea una nueva publicación, solo la envío a través de websocket y uso los datos para actualizar la colección.

Soy consciente de que esto no soluciona el problema con Ember Reload, pero supongo que esta es una solución decente para las personas que ya están usando Websockets / Socket.io.

Digamos que tengo dos modelos, Topic y 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 }); });

El tema tiene hasMany y una publicación belongsTo un tema.

Para cargar los datos de la API, se realiza una llamada inicial (que capta un tema ... tema ID 2, por ejemplo): GET /topics/2

Después de recibir la carga útil para esta solicitud GET, el serializador luego agrega una clave de links a la carga útil. Tiene la ruta para cargar las Publicaciones asociadas con el tema:

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

Esta segunda solicitud (a /topics/2/posts ) es cómo se cargan las /topics/2/posts y se adjuntan al tema.

Todo esto funciona bien cuando la página se carga por primera vez.

El problema ocurre cuando se crea una publicación durante una sesión de página . Aunque puedo obtener el tema en sí para volver a cargar (llamando a .reload() en el objeto modelo que representa el tema), las Posts asociadas con el tema no se vuelven a cargar. La segunda llamada de API (para obtener las publicaciones) nunca se realiza, mientras que la primera llamada (para obtener solo el tema) se realiza. Si actualizo la página, las publicaciones que creé en la carga de la página anterior se cargarán (pero, por supuesto, si voy y hago algunas publicaciones más, no aparecerán hasta que se cargue la próxima página).

Buscando una solución, me encontré con esta pregunta: ¿Cómo volver a cargar una asincrónica con enlaces tiene muchas relaciones?

Sin embargo, parece que la solución ya no funciona para las versiones actuales de Ember / Ember-Data. El JSFiddle provisto no funciona.

Entonces, ¿cómo puedo volver a cargar este tipo de relación hasMany? Cualquier ayuda es muy apreciada.


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

Ejemplo:

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