2013-04-09 7 views
7

J'ai une application Ember avec un formulaire de connexion qui renvoie l'utilisateur actuel au format JSON après une connexion réussie.Charger un modèle manuellement avec EmberData

L'utilisation de createRecord définit les attributs JSON renvoyés directement sur le modèle. Par exemple, is_private devient user.is_private, et non user.get('isPrivate')?

Comment puis-je charger le modèle utilisateur pour que les attributs soient définis correctement et que je ne doive pas le récupérer à l'aide de l'ID?

Répondre

7

Soi-disant, la voie officielle de le faire est d'utiliser adapter.load, comme described in this thread:

Chargement des données

Auparavant, certaines caractéristiques du magasin, comme load(), a pris un seul adaptateur .

Si vous voulez charger des données à partir de votre back-end sans l'application le demander (par exemple, à travers un flux de WebSockets), cette API :

store.adapterForType(App.Person).load(store, App.Person, payload);

Cette API sera également poignée transféré, et des données intégrées. Nous prévoyons d'ajouter une version plus pratique de cette API à l'avenir.

Malheureusement, il ne gère pas les données chargées en aval, contrairement à ce que prétend la documentation. Personnellement, j'utiliser quelque chose comme ce qui suit, qui est basé sur la façon dont find(ID) est mis en œuvre:

var id = json["person"]["id"]; 
var store = DS.get("defaultStore"); 
var adapter = store.adapterForType(App.Person); 
adapter.didFindRecord(store, App.Person, json, id); 
var person = App.Person.find(id); 

Notez que ce code suppose JSON dans le même format que find(ID) attend de recevoir du serveur, comme documented in the RESTAdapter guide:

{ 
    person: { 
    id: 1, 
    is_private: false, 
    projects: [3] 
    }, 
    projects: [ 
    { id: 3, name: "FooReader" } 
    ] 
} 

Cela s'appliquera à toutes les transformations que vous avez configurées en utilisant keyForAttributeName (comme le mappage is_private à isPrivate), et il gérera les enregistrements chargés à la volée. Je ne suis pas sûr que ce soit une bonne pratique, mais ça marche plutôt bien.

+0

Merci! J'étais proche de 'didFindRecord' mais je ne suis pas sûr de savoir exactement ce qui se passait avec cette méthode. – bschaeffer

+0

Salut. Ce retournement fonctionne très bien pendant que je remplis un seul enregistrement. Comment puis-je remplir plusieurs enregistrements? Par exemple: http://pastebin.com/raw.php?i=NNFVDYR0 – Mattia

+1

Et autant que je peux dire cela ne fonctionne plus dans ember-data 1.0.0-beta.3 Je l'utilisais dans ember-data 0.14 mais j'ai fini par utiliser la réponse andorov donné avec 1.0.0-beta.3: http://stackoverflow.com/a/18948134/1477165 – bfcoder

8

Depuis quelques jours dans ember data 1.0 beta, vous pouvez utiliser pushPayload pour charger les données directement dans le magasin. Par exemple, si vous envoyez des données à votre application via WebSockets (nous utilisons le module complémentaire Heroku Pusher). Vous pouvez appeler sur le magasin (source) directement et il passer par le sérialiseur approprié:

var postsJSON = { 
    posts: [ 
    {id: 1, post_title: "Great post"} 
    ] 
} 

this.store.pushPayload('post',postsJSON) 

Notez qu'il ne sera pas en charge un objet singulier (c.-à-post: {id: 1, post_title:"First!"}) - vous devez formater au pluriel avec un tableau.

DS.RESTSerializer a pushPayload aussi bien (source), auquel cas vous devez passer le magasin à la place.

J'encourage fortement la lecture du code source avant d'utiliser, comme il semble que la mise en œuvre de celui-ci sera rev isited.

+2

Je m'attends vraiment à ce que cela se casse un jour, mais au moins c'est quelque chose qui fonctionne pour l'instant. J'espère que non. J'ai dû transformer mon json en pluriel avec un tableau pour juste l'objet unique. – bfcoder

+0

Cela a été posté il y a plus d'un an et fonctionne encore parfaitement aujourd'hui, je suppose que c'est là pour rester. –

0

Toutes les réponses ci-dessus ne fonctionnent pas pour moi. Ce qui ne fonctionnait que pour moi était:

this.store.buildRecord(this.store.modelFor('person'), data.id, data) 
Questions connexes