使用过滤器嵌套 foreach 的淘汰赛
Knockout nested foreach with filters
我正在尝试在另一个 foreach 中添加一个 foreach 过滤器,假设我有一个带有 Employees 的第一个 foreach,我需要根据员工编号添加另一个 foreach,因此对于每个员工,我需要过滤相关的订单每一个。如何在我的视图中按员工编号过滤我的第二个 foreach 并循环遍历所有员工订单?
这是我的观点:
<div>
<table id="employee-table">
<thead>
<tr>
<th style="width: 15px" class="sorting_disabled"></th>
<th class="sorting_disabled">"EmployeeName"</th>
<th class="sorting_disabled">EmployeeNumber</th>
<th class="sorting_disabled">Address</th>
<th class="sorting_disabled">EmployeePosition</th>
<th class="sorting_disabled">OfficeName</th>
<th class="sorting_disabled">TotalCharges</th>
</tr>
</thead>
<tbody>
<!-- ko foreach: model.employeeList() -->
<tr>
<td data-bind="css: { 'dashboard-collapsed-triangle': $data.numberOfOrders > 0 },
click: function () { $('#employee-service-cost-table' + $data.employeeId).toggle(); $(this).toggleClass('dashboard-collapsed-triangle dashboard-expanded-triangle') }" >
</td>
<td><a href="#tips"><span class="dashboard-employee-selectable" data-bind="text: $data.employeeName"></span></a></td>
<td><span data-bind="text: $data.employeeNumber"></span></td>
<td><span data-bind="text: $data.address"></span></td>
<td><span data-bind="text: $data.employeePosition"></span></td>
<td><span data-bind="text: $data.officeName"></span></td>
<td><span data-bind="text: $data.totalCharges"></span></td>
</tr>
<!-- HERE I NEED A SECOND FOREACH -->
<tr style="display: none; background-color: aliceblue" data-bind="attr: { 'id': 'employee-service-cost-table' + $data.employeeId }">
<td></td>
<td colspan="3"><span data-bind="text: $data.OrderNumber"></span></td>
<td><span data-bind="text: $data.Description"></span></td>
<td><span data-bind="text: $data.TotalCharges"></span></td>
<td><span data-bind="text: $data.Date"></span></td>
</tr>
<!-- END SECOND FOREACH -->
<!-- /ko -->
</tbody>
</table>
所以如果我没理解错的话,你有一个员工列表和一个订单列表。那么一个员工可以根据员工id有多个订单?
一种方法是按员工 ID 对订单进行分组:
model.ordersByEmployeeId = ko.computed(function() {
var ordersByEmployeeId = {};
ko.utils.arrayForEach(model.orders(), function(order) {
var employeeId = ko.unwrap(order.employeeId);
if (!ordersByEmployeeId[employeeId]) {
ordersByEmployeeId[employeeId] = [];
}
ordersByEmployeeId[employeeId].push(order);
});
return ordersByEmployeeId;
});
那么您的循环将如下所示:
<!-- ko foreach: model.employeeList() -->
...
<!-- ko foreach: $root.ordersByEmployeeId()[$data.employeeId] -->
...
你可以将$data参数传递给二级foreach。
如果您将订单保存在单独的数组中,只需使用:
<!-- ko foreach: getOrders($data.employeeId) -->
其中 getOrders 是一个函数,它将过滤出特定员工的订单。
我正在尝试在另一个 foreach 中添加一个 foreach 过滤器,假设我有一个带有 Employees 的第一个 foreach,我需要根据员工编号添加另一个 foreach,因此对于每个员工,我需要过滤相关的订单每一个。如何在我的视图中按员工编号过滤我的第二个 foreach 并循环遍历所有员工订单?
这是我的观点:
<div>
<table id="employee-table">
<thead>
<tr>
<th style="width: 15px" class="sorting_disabled"></th>
<th class="sorting_disabled">"EmployeeName"</th>
<th class="sorting_disabled">EmployeeNumber</th>
<th class="sorting_disabled">Address</th>
<th class="sorting_disabled">EmployeePosition</th>
<th class="sorting_disabled">OfficeName</th>
<th class="sorting_disabled">TotalCharges</th>
</tr>
</thead>
<tbody>
<!-- ko foreach: model.employeeList() -->
<tr>
<td data-bind="css: { 'dashboard-collapsed-triangle': $data.numberOfOrders > 0 },
click: function () { $('#employee-service-cost-table' + $data.employeeId).toggle(); $(this).toggleClass('dashboard-collapsed-triangle dashboard-expanded-triangle') }" >
</td>
<td><a href="#tips"><span class="dashboard-employee-selectable" data-bind="text: $data.employeeName"></span></a></td>
<td><span data-bind="text: $data.employeeNumber"></span></td>
<td><span data-bind="text: $data.address"></span></td>
<td><span data-bind="text: $data.employeePosition"></span></td>
<td><span data-bind="text: $data.officeName"></span></td>
<td><span data-bind="text: $data.totalCharges"></span></td>
</tr>
<!-- HERE I NEED A SECOND FOREACH -->
<tr style="display: none; background-color: aliceblue" data-bind="attr: { 'id': 'employee-service-cost-table' + $data.employeeId }">
<td></td>
<td colspan="3"><span data-bind="text: $data.OrderNumber"></span></td>
<td><span data-bind="text: $data.Description"></span></td>
<td><span data-bind="text: $data.TotalCharges"></span></td>
<td><span data-bind="text: $data.Date"></span></td>
</tr>
<!-- END SECOND FOREACH -->
<!-- /ko -->
</tbody>
</table>
所以如果我没理解错的话,你有一个员工列表和一个订单列表。那么一个员工可以根据员工id有多个订单?
一种方法是按员工 ID 对订单进行分组:
model.ordersByEmployeeId = ko.computed(function() {
var ordersByEmployeeId = {};
ko.utils.arrayForEach(model.orders(), function(order) {
var employeeId = ko.unwrap(order.employeeId);
if (!ordersByEmployeeId[employeeId]) {
ordersByEmployeeId[employeeId] = [];
}
ordersByEmployeeId[employeeId].push(order);
});
return ordersByEmployeeId;
});
那么您的循环将如下所示:
<!-- ko foreach: model.employeeList() -->
...
<!-- ko foreach: $root.ordersByEmployeeId()[$data.employeeId] -->
...
你可以将$data参数传递给二级foreach。
如果您将订单保存在单独的数组中,只需使用:
<!-- ko foreach: getOrders($data.employeeId) -->
其中 getOrders 是一个函数,它将过滤出特定员工的订单。