获得hasMany协会的长度

时间:2015-05-14 00:24:53

标签: ember.js ember-data

我在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,这是准确的。所以我想我只需要弄清楚如何获取计算属性来查询数据?

1 个答案:

答案 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