2012-11-19 1 views
1

У меня есть список элементов ProjectPeriod в качестве наблюдаемого массива в режиме нокаутаModel, который включает в себя количество месяцев в каждом периоде. Я хочу показать дату окончания для каждой строки в foreach. В настоящее время я использую значение ko.computed в viewModel, но я не могу перебрать каждый элемент до отображаемого элемента. Как я могу перебирать и суммировать значения, отображаемые только до текущего элемента в foreach?Как я могу получить ko.computed текущую сумму foreach при итерации через наблюдаемыйarray в knockout.js

В настоящее время я следующий HTML:

<table> 
    <tr class="tableHeader"> 
     <th>Period</th> 
     <th>Number of Months</th> 
     <th>End of Period</th> 
    </tr> 
    <tbody data-bind="foreach: ProjectPeriod"> 
     <tr> 
      <td><input data-bind="value: ProjectYearText" /></td> 
      <td><input data-bind="value: PeriodMonths" /></td> 
      <td data-bind="text: endDate"></td> 
     </tr> 
    </tbody> 
</table> 

и следующий ViewModel:

function ProjectPeriod(projectYearId, projectYearText, periodMonths, viewModel) { 
    var self = this; 
     self.ProjectYearId = projectYearId; 
     self.ProjectYearText = ko.observable(projectYearText); 
     self.PeriodMonths = ko.observable(periodMonths); 
     self.viewModel = viewModel; 

     self.endDate = ko.computed(function() { 
      var startDate = hfProjectDates.Get("ProjectStartDate"); 

      // Calculate the number of months from the beginning to the current period. 
      var monthCount = 0; 
      ko.utils.arrayForEach(self.viewModel.ProjectPeriods(), function (projectPeriod) { 
       if (projectPeriod.ProjectYearId < self.ProjectYearId) 
        monthCount += projectPeriod.PeriodMonths; 
       }); 

      var endDate = moment(startDate).add('M', monthCount); 
      return endDate ? endDate.format("M/DD/YYYY") : "None"; 
     }); 
    } 

    function ProjectPeriodViewModel() { 
     // Data 
     var self = this; 

     self.ProjectPeriods = ko.observableArray([ 
      new ProjectPeriod(1, "1st Year", 12, ProjectPeriodViewModel), 
      new ProjectPeriod(2, "2nd Year", 12, ProjectPeriodViewModel), 
      new ProjectPeriod(3, "3rd Year", 12, ProjectPeriodViewModel) 
     ]); 

    } 

Я действительно просто начать работу с Knockout, поэтому я ожидаю, есть больше, чем несколько вопросов, с как я к этому приближаюсь. Но, в частности, мне нужно отобразить текущую дату окончания.

Обновление: на основе отзывов Мэтта, которые я обновил, чтобы включить наблюдаемые в ProjectPeriod, но у меня возникают проблемы с получением справки из viewModel и итерацией по массиву.

+0

Не уверен, что вы хотите. Вы хотите, чтобы общее количество месяцев в конце каждой строки? Итак, 12 месяцев для первого ряда, 24 для второго и так далее? –

+0

Да, по сути, это то, что мне нужно. период месяцев вводится в поля ввода. Мне нужна каждая строка, чтобы показать дату окончания. Таким образом, строка 1 может иметь 5 месяцев и periodEndDate будет startdate + 5 месяцев, строка 2 имеет 12 месяцев, а periodEndDate будет startdate + 17 месяцев. – tlbignerd

ответ

0

Есть несколько способов приблизиться к этому, что я бы, вероятно, сделать это переместить вычисленное свойство к ProjectPeriod самому объекту, а также дать ProjectPeriod ссылка на родительский ProjectPeriodViewModel, таким образом, то ProjectPeriod сможет получить доступ к ProjectPeriods и пересчитать назад, сбрасывая все периоды, которые были перед ним (может быть, идея дать каждому периоду свойство индекса, чтобы сделать это проще).

+0

Я тоже начинаю идти по этому пути. У меня уже есть Id, который я могу перечислить, но застрял в том, как добавить ссылку на ProjectPeriodViewModel. у вас есть пример того, как это может выглядеть? – tlbignerd

+0

@tlbignerd: Я думаю, что у вас есть это на основе вашего последнего редактирования. Я просто передал «ProjectPeriodViewModel» в качестве аргумента для конструктора. Ваша проблема может быть здесь 'ko.utils.arrayForEach (viewModel.ProjectPeriods() ...' Не должно быть 'self.viewModel.ProjectPeriods()'? –

+0

Я думал, что я тоже близко. .viewModel и передал ProjectPeriodVewModel в конструкторе (первоначально я использовал self в качестве параметра). Когда я запускаю это, я получаю сообщение об ошибке: Object не поддерживает свойство или метод 'ProjectPeriods' – tlbignerd

Смежные вопросы