2017-03-15 1 views
1

Je sais que si je veux sérialiser les commentaires imbriqués d'un modèle appelé post, j'ai besoin de créer un sérialiseur dans app/serializer/post.js quelque chose comme :comment sérialiser l'objet imbriqué sans créer un sérialiseur pour le modèle en ember

import RESTSerializer from 'ember-data/serializers/rest'; 
import DS from 'ember-data'; 

export default RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
     comments: {embedded: 'always'} 
    } 
}); 

Mais que se passe-t-il si je veux sérialiser cela dans l'app/serlizer/application.js? Je ne veux pas définir un sérialiseur pour chaque modèle. Au lieu de cela, je veux être capable de résoudre la relation appartenir à ou a-plusieurs dans le normalizeQueryResponse par exemple.

normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) { 
    console.log(payload); 
    return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true); 
    }, 

Je veux être en mesure d'aller en profondeur la charge utile et si une propriété en charge utile est avéré être l'objet puis résoudre cela.

Est-ce que quelqu'un sait si c'est possible?

+0

pourquoi ne vous créez pas sérialiseur pour votre modèle et hériter si à partir de Application.js? Ainsi, vous pouvez faire ce que vous voulez dans l'application et si vous voulez personnaliser chaque modèle, cela sera également possible. – Majid

+0

@majid pouvez-vous s'il vous plaît expliquer ce que vous voulez dire exactement? –

+0

Jetez un oeil à ce https://github.com/mhadaily/breweryUp-Ember/tree/master/app/serializers, je pense que cela peut vous donner un indice, Si non, laissez-moi vous expliquer plus, Comme vous le verrez, par exemple dans beer.js, importez ApplicationSerializer à partir de './application'; et ... – Majid

Répondre

0

Bien sûr, c'est possible et c'est comme ça que les sérialiseurs et les modèles fonctionnent. Mais je recommande de s'appuyer sur un modèle et de ne pas spécifier le type dans votre cas. Prenons cet exemple.

Votre modèle post.js

export default DS.Model.extend((
    valueA: DS.attr('string'), // converted to string 
    valueB: DS.attr('boolean'), // converted to boolean 
    comments: DS.attr() // not converted and set as it came in the payload 
)); 

Votre sérialiseur post.js

export default RESTSerializer.extend({ 
    // assuming your payload comes in the format of 
    // { data: [ {id: 0, valueA: '', valueB: true, comments: [...]}, {id:1 ...} ] 
    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) { 
    payload.data = payload.data.map((item, index) => ({ // item = {event_type: '', values: ['','']} 
     id: index, // ONLY if your payload doesnt already have an id 
     type: 'post', // set the model type 
     attributes: { // attributes are the values declared in the model 
     valyeA: item.valueA, 
     valueB: item.valueB, 
     comments: item.comments.map(item => { 
      // remap your comments to whatever format you need 
     }) 
     } 
    })); 
    return payload; 
}); 

Utilisation dans votre applicatioin

this.get('store').query('post', {...query object...}).then( 
response => { 
    let firstItemLoadedComments = response.get('firstObject.values'); 
    // blast comments! 
}, 
error => { 
    Ember.Logger.error(`cannot load model: ${error}`); 
}) 
.finally(() => { 
    // set loading to false or something else 
});