2015-09-02 24 views
8
Ember  : 1.13.3 
Ember Data : 1.13.5 
jQuery  : 1.11.3 

Sto tentando di inviare un carico utile JSON utilizzando i dati ember dal mio client EmberJS al mio server. Voglio inviare l'intero grafico dell'oggetto al server al salvataggio del progetto, poiché non desidero inviare più richieste. Non mi dispiacerebbe inviare richieste multiple, ma sono preoccupato per ciò che accade se una delle richieste non riesce nel mezzo e i dati sul server non saranno corretti.Elementi incorporati di EmberJS nel carico utile JSONAPI

Volevo utilizzare JSONAPI (http://jsonapi.org/format/#document-compound-documents) poiché sta diventando l'adattatore predefinito in Ember. Inoltre, ci sono alcune librerie C# che gestiscono questo formato, quindi ho pensato che sarebbe abbastanza semplice. Tuttavia, dopo aver letto le specifiche, sembra che non possa incorporare oggetti se non hanno un id. EmberJS inoltre non collega gli oggetti figli a JSON neanche se ho specificato { async: false, embedded: 'always' }) su DS.attr.

La mia domanda è: se un'applicazione viene utilizzata in modo tale da creare un grafico oggetto sul lato client, come si usa il formato JSONAPI per inviare l'intero grafico dell'oggetto al server? Devo generare id sul lato client per soddisfare lo standard JSONAPI? Quindi, una volta arrivati ​​al server, li ignorano e vengono salvati con un ID generato dall'ORM?

Ecco il mio modello labelGroup:

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    labels: DS.hasMany('label-model', { async: false, embedded: 'always' }) 
}); 

Ecco il mio modello di progetto:

import DS from 'ember-data'; 

export default DS.Model.extend(DS.EmbeddedRecordsMixin, { 
    name: DS.attr('string'), 
    labelGroups: DS.hasMany('labelGroup', { async: false, embedded: 'always'}) 

}); 

Qui è il post che ho dopo aver fatto un save() sul progetto:

{ 
    "data":{ 
    "attributes":{"name":"Project"}, 
    "relationships":{ 
     "label-groups":{ 
     "data":[ 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null} 
     ] 
    } 
    }, 
    "type":"label-projects" 
    } 
} 

AGGIORNAMENTO: Ho provato a utilizzare https://www.npmjs.com/package/ember-cli-uuid per generare gli ID lato client di cui dispone. Tuttavia i dati che ottengono l'output non includono gli oggetti extra, solo un riferimento ai loro id. Mi aspettavo di vedere una proprietà "inclusa" come specificato qui: http://jsonapi.org/format/#document-compound-documents, ma non è lì.

{ 
    "data":{ 
    "id":"7b4544ee-91cd-493d-8b10-52040e68c283", 
    "attributes":{"name":"Project"}, 
    "relationships":{ 
    "label-groups":{ 
     "data":[ 
     {"type":"label-groups","id":"08115273-e82a-4d46-93ea-232ce071fb78"}, 
     {"type":"label-groups","id":"9ca94fe9-8077-411e-98d2-1694c6fecce4"}, 
     {"type":"label-groups","id":"d629f1e8-7962-404d-8034-38229ab21f77"}, 
     {"type":"label-groups","id":"c6bda655-5489-4760-847b-bf02239bb2c5"}, 
     {"type":"label-groups","id":"f6fef249-2d1d-43f0-ba64-24b7ff8b5637"}, 
     {"type":"label-groups","id":"a7db25bf-52c8-477b-83e4-64e7c76b072e"}, 
     {"type":"label-groups","id":"f3b5fbb3-261a-4b3d-b481-b9352f8ce2d6"} 
     ] 
    } 
    }, 
    "type":"label-projects" 
    } 
} 
+0

Ho fatto una piccola ricerca e ho scoperto che JSONAPI non ha ancora una soluzione finale per i record "incorporati" o "inclusi" per le richieste POST o PATCH. https://github.com/lytics/ember-data-model-fragments addon sembra essere un tentativo di fornire quella funzionalità. Lo proverei. – Grapho

risposta

3

Ember-dati non ha il supporto per ciò che si desidera in questo momento. Quindi i dati ember non salveranno i dati delle relazioni in un payload di salvataggio.

Ma è possibile farlo da soli utilizzando un adattatore e un serializzatore personalizzati. Consiglio vivamente di controllare il API e quindi cercare nella fonte.

Se si chiama .save() sul proprio modello, viene chiamato il metodo createRecord sull'adattatore. Qui il serializeIntoHash sul serializzatore viene chiamato per serializzare il modello.

serializeIntoHash chiamate serialize, dove viene chiamato serializeBelongsTo e serializeHasMany.

Ora si può semplicemente ignorare serializeHasMany e modificare il hasMany prima della riga:

json[payloadKey] = hasMany; 

Qui si ha il tipo e gli ID come vengono inviati via braci-dati. Potresti solo .forEach i dati su hasMany e poi recuperare lo store per i dati e creare l'array included.

Spero che questo ti aiuti a capire il serializzatore e l'adattatore in modo che tu possa modificarlo per fare tutto ciò che vuoi piuttosto facile. In realtà questa è la parte migliore di ember-data. La struttura dell'adattatore e il serializzatore, che consente facili modifiche.

Problemi correlati