0

我有两个模型

时间输入

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')
});

我如何获得一组时间条目实体,以便我可以计算花费在任务上的总时间?上述方法不起作用。

时间条目标题属性有效。

4

2 回答 2

1

您的代码中有一些错误:

1-在那个foreach中

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

for ... in不像您对数组的预期那样工作,您需要使用orfor(var i; i < array.length; i++)array.forEach(func).

2 - 在计算属性中totalTime,您将使用 的duration属性TimeEntry,您需要使用property('timeEntries.@each.duration').

3 - 可能您的timeEntries属性将从服务器获取,因此您需要async: true在定义中使用该选项:

timeEntries: DS.hasMany('TimeEntry', { async: true })

4 - 如果你timeEntries的总是空的,即使是保存在数据库中的数据。确保您返回的 json 具有 timeEntries id。例如:

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

修改后的代码如下:

TimeTray.Task = DS.Model.extend({
    title: DS.attr('string'),
    totalTime: function () {
        var duration = 0;
        this.get('timeEntries').forEach(function(entry) {
            duration += entry.get('duration')
        });
        return duration;
    }.property('timeEntries.@each.duration'),
    isDeleted: DS.attr('boolean'),
    isRecording: DS.attr('boolean', { defaultValue: false }),
    timeEntries: DS.hasMany('TimeEntry', { async: true })
});

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

我希望它有帮助

于 2013-10-01T16:48:14.633 回答
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()and reduce()

totalTime: function () {
    return this.get('timeEntries').getEach('duration').reduce(function(accum, item) {
        return accum + item;
    }, 0);
}.property('timeEntries.@each.duration'),
于 2013-10-01T16:50:00.297 回答