2013-10-01 5 views
0

У меня есть две моделиRetriving модели для HasMany отношений

Время входа

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

Могу ли я знать, почему мой ответ был unaccept? –

+0

Привет, моя проблема была не в динамике javascript langauge, я знаю, что для (... in ..), получается, я предположил, что если бы я создал отношения на timeEntry к задаче, ember автоматически добавит timeEntry к задание. но это не так, поэтому мне пришлось возвращать массив с идентификаторами timeEntry для задач. если вы добавите это в свой ответ, я с радостью повторю его принятие. – Billybonks

+0

Хорошо. Я пропустил это. Теперь ответ обновлен. –

ответ

1

У вас есть какая-то ошибка в коде:

1- В этом Еогеаспе

... 
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 свойство TimeEntry, необходимо указать, что зависимость с помощью property('[email protected]').

3 - прочертовский ваше timeEntries имущество будет получен с сервера, так что вам нужно будет использовать опцию async: true, в вашем определении:

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

4 - Если timeEntries всегда пусто, даже данные сохраняются в вашей базе данных. Убедитесь, что ваш возвращенный json имеет идентификаторы timeEntries. Например:

{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('[email protected]'), 
    isDeleted: DS.attr('boolean'), 
    isRecording: DS.attr('boolean', { defaultValue: false }), 
    timeEntries: DS.hasMany('TimeEntry', { async: true }) 
}); 

И это скрипка с этим образцом рабочего http://jsfiddle.net/marciojunior/9DucM/

Я надеюсь, что это помогает

0

Ваш метод totalTime является не суммируя время продолжительности и не возвращая значение. Кроме того, ваш 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('[email protected]'), 

Или, более элегантно используя getEach() и reduce():

totalTime: function() { 
    return this.get('timeEntries').getEach('duration').reduce(function(accum, item) { 
     return accum + item; 
    }, 0); 
}.property('[email protected]'), 
Смежные вопросы