我有两个型号
时间录入
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实体,以便我可以计算在任务上花费的总时间?上述方法无效。
时间条目标题属性有效。
答案 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'),