我在Ember项目中定义了以下模型(使用ember-cli创建的项目0.2.3)
import DS from 'ember-data';
var Game = DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
geekRating: DS.attr('number')
});
Game.reopenClass({
FIXTURES: [
{ id: "1", title: "Catan", description: "Catan the game", geekRating: "5.65"}
]
});
export default Game;
import DS from 'ember-data';
var OwnedGame = DS.Model.extend({
rating: DS.attr('number'),
plays: DS.hasMany('gamePlay'),
game: DS.belongsTo('game', {async: true}),
playCount: function() {
return this.get('plays.length')
}.property('plays')
});
OwnedGame.reopenClass({
FIXTURES: [
{ id: "1", rating: "8.25", game: "1"}
]
});
export default OwnedGame;
import DS from 'ember-data';
var GamePlay = DS.Model.extend({
date: DS.attr('date'),
ownedGame: DS.belongsTo('ownedGame', {async: true})
});
GamePlay.reopenClass({
FIXTURES: [
{id: "1", date: "2015-01-01", ownedGame: "1"},
{id: "2", date: "2015-02-01", ownedGame: "1"}
]
});
export default GamePlay;
然后在我拥有的游戏/ index.hbs
中<h1>My Games</h1>
<table class="table table-striped table-condensed table-hover">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Your Rating</th>
<th>Geek Rating</th>
<th>Plays</th>
</tr>
</thead>
<tbody>
{{#each game in this}}
<tr>
<td>{{game.game.title}}</td>
<td>{{game.game.description}}</td>
<td>{{game.rating}}</td>
<td>{{game.game.geekRating}}</td>
<td>{{game.playCount}}</td>
</tr>
{{/each}}
</tbody>
</table>
我正在尝试使用计算属性显示plays
的{{1}}的长度。请注意,正如您所看到的,我正在使用Fixture Data,因此不确定这是否是一个限制。我没有收到任何错误,OwnedGames列表显示正常(现在只有1个)。我的游戏大小为0。
我已经阅读了有关此问题的其他类似帖子,我相信我的代码是正确的,但不确定它为什么不起作用。
更新:
我也试过在每次游戏迭代中都这样做:
OwnedGame
我没有输出。
更新#2:
我创建了所有必要的代码来查看GamePlay的列表。在我访问GamePlay列表之前,大小为0。然后,如果我回到我的OwnedGames列表,GamePlay的长度现在是2,这是准确的。所以我想我只需要弄清楚如何获取计算属性来查询数据?
答案 0 :(得分:1)
如果有hasMany
关系,您可以选择两种方法来获取侧面加载的数据。
第一个选项是通过在plays
灯具上指定具有game-play
ID的数组来指定所需的owned-game
条记录。这将自动为您再次请求game-play
并异步填充模型。
App.OwnedGame.reopenClass({
FIXTURES: [
{id: 1, rating: 8.25, game: 1, plays: [1,2]}
]
});
第二个选项是手动发出第二个请求以获取game-play
数据,这将异步填充plays
owned-game
属性。
App.IndexRoute = Ember.Route.extend({
model: function () {
return new Ember.RSVP.hash({
gamePlay: this.store.find('game-play'),
ownedGame: this.store.find('owned-game')
});
},
setupController: function(controller, model) {
controller.set('model', model.ownedGame);
}
});
<强> http://emberjs.jsbin.com/woruqugida/1/edit?html,js,output 强>