2017-03-15 1 views
1

Récemment, j'ai commencé à apprendre des données Ember et j'écris une application avec une API très personnalisée. La réponse de Back-end est en mauvais format, donc je la normalise à JsonApi via la méthode 'normalizeResponse' et tout fonctionne bien.Ember-Data: InnerObject a EmptyObjects - ce qui n'est pas vrai

Le problème apparaît au moment où je veux voir le contenu de la réponse. Quand je lisais sur Ember-data, j'ai appris que si je recevais des données (InnerObjects), je serais capable d'en prendre des propriétés via. InnerObject.get ('some_property'), mais ça ne marche pas pour moi. Si je veux 'some_property', je dois écrire InnerObject.data.someproperty ce qui semble mauvais dans un chemin plus long. J'ai utilisé Ember.debug() pour voir ce chemin et mon navigateur me montre que la propriété '_data' est EmptyObject ce qui n'est pas vrai. Quand je clique dessus, il affiche une liste de contenu correct (voir pièce jointe). Est-ce que je fais quelque chose de mal? Suis-je en train d'oublier quelque chose ou d'avoir mal compris Ember-Data? Je serai reconnaissant pour toute aide.

IMAGES:

export default DS.Model.extend({ 
 

 
    facebook: DS.attr(), 
 
    www: DS.attr(), 
 
    name: DS.attr(), 
 
    street: DS.attr(), 
 
    house_number: DS.attr(), 
 
    postal_code: DS.attr(), 
 
    city: DS.attr(), 
 
    province: DS.attr(), 
 
    picture: DS.attr(), 
 
    x: DS.attr(), 
 
    y: DS.attr() 
 

 
}); 
 
//json api serializer 
 
export default ApplicationSerializer.extend({ 
 

 
    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) { 
 
    return this._super(store, primaryModelClass, this._normalizeSearch(payload), id, requestType); 
 
    }, 
 

 
    _normalizeSearch(shops) { 
 
    let data = shops.map((obj) => { 
 
     return { 
 
      type: "search", 
 
      id: obj.id_sklep, 
 
      attributes: { 
 
      facebook: obj.facebook, 
 
      www: obj.www, 
 
      name: obj.nazwa_sklep, 
 
      street: obj.adres_ulica, 
 
      house_number: obj.adres_nr_domu, 
 
      postal_code: obj.adres_kod, 
 
      city: obj.adres_miasto, 
 
      province: obj.adres_woj, 
 
      picture: obj.zdjecie_sklep, 
 
      x: obj.lat, 
 
      y: obj.lng 
 
      } 
 
     }; 
 
    }); 
 

 
    return { data: data } ; 
 
    } 
 

 
}); 
 

 
export default Ember.Service.extend({ 
 

 
    getShopsAndServices(pattern) { 
 
    return this.get('store').query('search', { 
 
     fraza: pattern, 
 
     cena_min: 0, 
 
     cena_max: 100, 
 
     id_kat: 1, 
 
     lat: 53, 
 
     lng: 18 
 
    }); 
 
    } 
 
    
 
} 
 

 
//Controller action: 
 
    searchRequest(pattern) { 
 
     return pattern.length > this.MIN_CHARS_FOR_SEARCH ? this.get('search').getShopsAndServices(pattern).then((results) => { 
 
     let content = results.get('content').length ? results.get('content') : []; 
 
     if (content) { 
 
      let foo = content[0]; 
 
      Ember.Logger.debug(foo) 
 
      Ember.Logger.debug(foo._data.name) 
 
      Ember.Logger.debug(foo.get('name')) 
 
     } 
 
     return this.set('content', results.get('content').length ? results.get('content') : []); 
 
     }) : this.set('content', []); 
 
    },

Répondre

0

InnerObject.data.someproperty => Ceci est faux.
InnerObject.get('some_property') => c'est vrai.

Mettez à jour votre question sans code fonctionnel. afin que nous puissions identifier le problème. La méthode 1.query renvoie Promise et celle-ci sera résolue en DS.RecordArray qui étend Ember.ArrayProxy afin que vous puissiez utiliser toutes les méthodes disponibles.

2. results.get('content') - Ne pas accéder à la propriété content,

3.You peut convertir ce tableau spécial tableau normal par results.toArray()

4.You peut même utiliser each aide pour itérer comme tableau normal modèle qui est retourné par ce this.get('search').getShopsAndServices(pattern).