Letztes Update für immer : Ich kann das nicht ständig aktualisieren. Das ist also veraltet und wird wahrscheinlich so sein. Hier ist ein besserer und aktuellerer Thread. EmberJS: Wie lade ich mehrere Modelle auf derselben Route?
Update: In meiner ursprünglichen Antwort habe ich gesagt, embedded: true
in der Modelldefinition zu verwenden. Das ist falsch In Revision 12 erwartet Ember-Data, dass Fremdschlüssel mit einem Suffix ( Link ) _id
für einen einzelnen Datensatz oder _ids
für die Erfassung definiert werden. Ähnliches wie das Folgende:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Ich habe die Geige aktualisiert und werde dies erneut tun, wenn sich etwas ändert oder wenn ich weitere Probleme mit dem in dieser Antwort angegebenen Code finde.
Antwort mit verwandten Modellen:
Für das Szenario, das Sie beschreiben, würde ich mich auf Assoziationen zwischen Modellen (Einstellung embedded: true
) verlassen und das Post
Modell nur auf dieser Route laden , da ich eine DS.hasMany
Assoziation für das Comment
Modell und eine DS.belongsTo
Assoziation für das User
sowohl im Comment
als auch im Post
Modell definieren kann. Etwas wie das:
App.User = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
email: DS.attr('string'),
posts: DS.hasMany('App.Post'),
comments: DS.hasMany('App.Comment')
});
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
author: DS.belongsTo('App.User'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
body: DS.attr('string'),
post: DS.belongsTo('App.Post'),
author: DS.belongsTo('App.User')
});
Diese Definition würde ungefähr Folgendes ergeben:
Mit dieser Definition habe ich immer dann, wenn ich find
einen Beitrag verfasse, Zugriff auf eine Sammlung von Kommentaren, die diesem Beitrag zugeordnet sind, sowie auf den Autor des Kommentars und den Benutzer, der der Autor des Beitrags ist, da alle eingebettet sind . Die Route bleibt einfach:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
In PostRoute
(oder PostsPostRoute
wenn Sie verwenden resource
) haben meine Vorlagen Zugriff auf die Controller content
, bei denen es sich um das Post
Modell handelt, sodass ich mich einfach auf den Autor beziehen kannauthor
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{author.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(siehe Geige )
Antwort mit nicht verwandten Modellen:
Allerdings, wenn Ihr Szenario ein wenig komplexer als das, was Sie beschrieben, und / oder hat zu verwenden (oder Abfrage) verschiedene Modelle für eine bestimmte Route, würde ich empfehlen , es in zu tun Route#setupController
. Beispielsweise:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
// in this sample, "model" is an instance of "Post"
// coming from the model hook above
setupController: function(controller, model) {
controller.set('content', model);
// the "user_id" parameter can come from a global variable for example
// or you can implement in another way. This is generally where you
// setup your controller properties and models, or even other models
// that can be used in your route's template
controller.set('user', App.User.find(window.user_id));
}
});
Und jetzt, wenn ich mich in der Post-Route befinde, haben meine Vorlagen Zugriff auf die user
Eigenschaft im Controller, wie sie in setupController
Hook eingerichtet wurde:
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{controller.user.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(siehe Geige )