Sonsuza dek son güncelleme : Bunu güncellemeye devam edemiyorum. Yani bu kullanımdan kaldırıldı ve muhtemelen bu şekilde olacak. işte daha iyi ve daha güncel bir iş parçacığı EmberJS: Aynı rotaya birden fazla model nasıl yüklenir?
Güncelleme: Orijinal cevabımda embedded: true
model tanımında kullanmamı söyledim . Bu yanlış. Revizyon 12'de Ember-Data, yabancı anahtarların tek kayıt veya toplama için bir son ek ( bağlantı ) ile tanımlanmasını bekler . Aşağıdakine benzer bir şey:_id
_ids
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Keman'ı güncelledim ve herhangi bir değişiklik olursa veya bu yanıtta verilen kodla ilgili daha fazla sorun bulursam bunu tekrar yapacağım.
İlgili modellerle cevaplayın:
Sizin tarif edilmektedir senaryosu için, ben güvenmek istiyorum ilişkilendirmeleri modelleri arasındaki (ayar embedded: true
) ve sadece yük Post
Ben tanımlayabilirsiniz göz önüne alırsak bu rotada modeli DS.hasMany
için dernek Comment
modeli ve DS.belongsTo
için dernek User
hem de Comment
ve Post
modeller. Bunun gibi bir şey:
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')
});
Bu tanım aşağıdaki gibi bir şey üretecektir:
Bu tanımla, ne zaman find
bir Gönderi yapsam, bu gönderi ile ilişkili bir yorum koleksiyonuna ve yorumun yazarına ve hepsi gömülü olduğu için gönderinin yazarı olan kullanıcıya erişime sahip olacağım . Rota basit kalır:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Yani içinde PostRoute
(veya PostsPostRoute
kullanıyorsanız resource
), şablonlarım model content
olan denetleyiciye erişebilecek Post
, böylece yazara basitçeauthor
<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>
( keman bakın )
İlgili olmayan modellerle cevaplayın:
Senin senaryo açıklanan olandan biraz daha karmaşıktır ve / veya Ancak, sahip belirli bir rota için kullanım (veya sorgu) farklı modellere, ben bunu yapmak için öneriyoruz Route#setupController
. Örneğin:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
setupController: function(controller, model) {
controller.set('content', model);
controller.set('user', App.User.find(window.user_id));
}
});
Ve şimdi Gönderi yolundayken, şablonlarım kancada user
ayarlandığı için denetleyicideki özelliğe erişebilecek setupController
:
<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>
( keman bakın )