检索HasMany关系的模型

时间:2013-10-01 13:21:52

标签: ember.js ember-data

我有两个型号

时间录入

TimeTray.TimeEntry = DS.Model.extend({
    startTime: DS.attr('date'),
    endTime: DS.attr('date'),
    status: DS.attr('string'),
    offset: DS.attr('number'),
    isDeleted: DS.attr('boolean'),
    task: DS.belongsTo('task'),
    duration: function () {
        return TimeTray.timeController.duration(this.get('startTime'), this.get('endTime'));
    }.property('startTime', 'endTime'),
    title: function () {
        if (this.get('task')) {
            return this.get('task').get('title');
        }
    }.property('task')
});

任务

TimeTray.Task = DS.Model.extend({
    title: DS.attr('string'),
    totalTime: function () {
        var timeEntries = this.get('timeEntries')
        for (var entry in timeEntries) {
           var duration =  entry.get('duration')
        }
    }.property('timeEntries'),
    isDeleted: DS.attr('boolean'),
    isRecording: DS.attr('boolean', { defaultValue: false }),
    timeEntries: DS.hasMany('TimeEntry')
});

如何获得一组timeentry实体,以便我可以计算在任务上花费的总时间?上述方法无效。

时间条目标题属性有效。

2 个答案:

答案 0 :(得分:1)

您的代码中存在一些错误:

1-在那个foreach

...
for (var entry in timeEntries) {
  var duration =  entry.get('duration')
}
...

for ... in无法正常使用数组,您需要使用或for(var i; i < array.length; i++)array.forEach(func)

2 - 在计算属性totalTime中,您将使用duration的{​​{1}}属性,您需要使用TimeEntry指定该依赖项。

3 - 从您的服务器中获取property('timeEntries.@each.duration')属性,因此您需要在定义中使用timeEntries选项:

async: true

4 - 如果您的timeEntries: DS.hasMany('TimeEntry', { async: true }) 始终为空,即使数据也保存在数据库中。确保返回的json具有timeEntries ID。例如:

timeEntries

更改的代码如下:

{id: 1, title: 'Task 1', timeEntries: [1,2,3] }    

这是这个样本工作http://jsfiddle.net/marciojunior/9DucM/

的小提琴

我希望它有所帮助

答案 1 :(得分:0)

您的totalTime方法既不是对timeEntry持续时间求和也不是返回值。此外,property未正确设置(使用@each)。这样做的正确方法是:

totalTime: function () {
    var timeEntries = this.get('timeEntries')
    var duration = 0;
    for (var entry in timeEntries) {
       duration = duration + entry.get('duration');
    }
    return duration;
}.property('timeEntries.@each.duration'),

或者,更优雅地使用getEach()reduce()

totalTime: function () {
    return this.get('timeEntries').getEach('duration').reduce(function(accum, item) {
        return accum + item;
    }, 0);
}.property('timeEntries.@each.duration'),