Come ricaricare un async con i collegamenti ha un rapporto?

Diciamo che abbiamo

Post = DS.Model.extend({ comments: DS.hasMany({async: true}) }) Comment = DS.Model.extend({ post: DS.belongsTo() }) 

e devo usare la funzionalità dei links perché altrimenti ottengo un errore 414 a causa di troppi commenti su un post.

Dato che questo commit https://github.com/emberjs/data/commit/4d717bff53f8c93bedbe74e7965a4f439882e259

Sembra imansible innescare un ricaricamento del post.get ('commenti'), ossia inviando una richiesta GET ad esempio post / 42 / commenti.

C'è una soluzione per questo?

AGGIORNARE

Come @ sly7_7 ha detto nella tua risposta in seguito, questa funzionalità è ora disponibile in dati personali. Quindi, se si utilizza la versione 1.0.0-beta.11 o superiore, questo codice non è necessario

È ansible riaprire il ManyArray e creare un nuovo metodo chiamato reloadLinks() . Con i seguenti:

 var get = Ember.get; DS.ManyArray.reopen({ reloadLinks: function() { var records = get(this, 'content'), store = get(this, 'store'), owner = get(this, 'owner'), type = get(this, 'type'), name = get(this, 'name'), resolver = Ember.RSVP.defer(); var meta = owner.constructor.metaForProperty(name); meta.type = type; var link = owner._data.links[meta.key]; store.findHasMany(owner, link, meta, resolver); } }); 

L'utilizzo è il seguente:

 comments.reloadLinks(); 

Dai un'occhiata in quel violino http://jsfiddle.net/H6Gqf/

Grazie a @igorT, questo è attuato. https://github.com/emberjs/data/pull/2297

Ora il ManyArray ha un metodo di ricarica (), che puoi persino call se la relazione non è ancora stata caricata.

È ansible vedere alcuni casi di utilizzo leggendo i test

La ricarica di un hasMany non è ancora direttamente incorporata in Ember Data, ma è in corso. La soluzione che utilizzi richiede Ember Data 1.0b9 + canary, che include i risultati coalescenti opt-in .

Fase 1: opt-in.

Ho optato al livello di ApplicationAdapter, ma potresti volerlo su base di adattatore per model. Ecco quello che ho:

 MyApp.ApplicationAdapter = DS.ActiveModelAdapter.extend({ coalesceFindRequests: true }); 

Per darti un'idea del perché questo sia importnte e buono, una pagina nella nostra applicazione ha visto 50+ richieste prima di questa modifica. Ora vediamo solo 11. Non è ancora grande, ma è un inferno di un miglioramento!

Fase 2: Ricaricare le registrazioni nell'Associazione

Mi limito a ricaricare una function sul mio model come così:

 MyApp.SomeModel = DS.Model.extend({ fooMany: DS.hasMany('foo', { async: true }), barMany: DS.hasMany('bar', { async: true }), bazOne: DS.belongsTo('baz', { async: true }), reloadAssociated: function () { var foosPromises = this.get('foos').invoke('reload'), barsPromises = this.get('bars').invoke('reload'), bazPromise = this.get('baz').reload(); return Em.RSVP.hash({ foos: foosPromises, bars: barsPromises, baz: bazPromise }); } }); 

Ammetto che non è terribilmente grazioso, ma è la soluzione migliore che ho trovato finché la ricarica non è costruita direttamente nelle associazioni.

ho avuto lo stesso problema e ho truffato per trovare una "soluzione"

ho creato un componente "CommentLoader". Questo componente prende un argomento (post_id) e prima di "inserisce" (willInsertElement) i gradi tutti i commenti e li rende. funziona ma … non sono fiero di questo 🙁

Con ember-data-1.0.0-beta.10 Sto utilizzando l'estensione del model seguente.

Basta call model.reloadRelationship(name) where nome è il nome dell'attributo model che rappresenta la relazione.

Questo funziona sia per il normale che per il collegamento.

 DS.Model.reopen({ reloadRelationship: function(name) { var meta = this.constructor.metaForProperty(name), link = this._data.links ? this._data.links[meta.key] : null; if (!link) { if (meta.kind === 'belongsTo') { this.get(name).then(function(model) { model.reload(); }); } else { this.get(name).invoke('reload'); } } else { meta.type = this.constructor.typeForRelationship(name); if (meta.kind === 'belongsTo') { this.store.findBelongsTo(this, link, meta); } else { this.store.findHasMany(this, link, meta); } } } }); 

L'unica cosa che manca qui sono alcuni controlli, ad esempio un controllo se il model è già ricaricato quando il model viene ricaricato con un collegamento o un controllo per vedere se il nome della properties; esiste all'interno del model corrente.

EDIT ember-data-1.0.0-beta.14:

 DS.Model.reopen({ reloadRelationship: function(key) { var record = this._relationships[key]; if (record.relationshipMeta.kind === 'belongsTo') { return this.reloadBelongsTo(key); } else { return this.reloadHasMany(key); } }, reloadHasMany: function(key) { var record = this._relationships[key]; return record.reload(); }, reloadBelongsTo: function(key) { var record = this._relationships[key]; if (record.link) { return record.fetchLink(); } else { record = this.store.getById(record.relationshipMeta.type, this._data[key]); return record.get('isEmpty') ? this.get(key) : record.reload(); } } }); 

La relazione di HasMany sarà riconducibile al metodo di ricarica nativo.

Per il rapporto BelongsTo, prima controllare se il record deve essere ricaricato (se non è ancora caricato prima, sarà solo chiamata per get il recupero, altrimenti chiamerà il ricarica).

Un'altra opzione è aggiungere un metodo al model. Dovrebbe anche lavorare per hasMany:

 search: DS.belongsTo('search', {async: true}) updateSearch: -> resolver = Ember.RSVP.defer() resolver.resolve = => # do something after promise resolves relationship = @constructor.metaForProperty('search') link = @_data.links[relationship.key] @store.findBelongsTo this, link, relationship, resolver