【问题标题】:Knockout nested foreach with filters用过滤器淘汰嵌套的 foreach
【发布时间】:2015-07-06 21:31:03
【问题描述】:

我正在尝试在另一个 foreach 中添加一个 foreach 过滤器,假设我有一个员工的第一个 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') }" >&nbsp;
            </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>

【问题讨论】:

    标签: knockout.js knockout-2.0


    【解决方案1】:

    您可以将 $data 参数传递给二级 foreach。

    如果您将订单保存在单独的数组中,请使用:

    <!-- ko foreach: getOrders($data.employeeId) -->
    

    其中 getOrders 是一个过滤特定员工订单的函数。

    【讨论】:

      【解决方案2】:

      所以如果我理解正确的话,你有一份员工名单和一份订单清单。那么一个员工可以根据员工 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] -->
          ...
      

      【讨论】:

      • 是的,一个员工可以有多个订单,我需要一个计算字段吗?或者我可以直接在视图上进行过滤?
      • 您可以在视图中执行此操作,但您通常希望视图中的逻辑尽可能少。
      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 2011-08-11
      • 2013-04-20
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多