【发布时间】:2012-11-19 21:39:57
【问题描述】:
我在淘汰视图模型中有一个 ProjectPeriod 项目列表作为 observableArray,其中包括每个时期的月数。我想显示 foreach 中每一行的结束日期。目前,我在 viewModel 中使用 ko.computed 值,但我无法遍历每个项目直到显示的项目。如何循环并总结仅显示到 foreach 中当前项目的值?
目前我有以下 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>
以及以下视图模型:
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,所以我预计我处理此问题的方式会有很多问题。但具体来说,我需要显示运行结束日期。
更新:基于 Matt;s 的反馈,我已更新以在 ProjectPeriod 中包含可观察对象,但我在从 viewModel 获取引用和迭代数组时遇到了问题。 p>
【问题讨论】:
-
不确定你想要什么。你想在每行的末尾累积月数吗?那么第一行是 12 个月,第二行是 24 个月,以此类推?
-
是的,基本上这就是我所需要的。在输入框中输入月份。我需要每一行显示结束日期。因此,第 1 行可能有 5 个月,periodEndDate 将是 startdate + 5 个月,第 2 行输入了 12 个月, periodEndDate 将是 startdate + 17 个月。
标签: javascript foreach knockout.js