knockout.js自定义绑定foreach - 使用ID

时间:2013-05-31 10:47:43

标签: knockout.js ko-custom-binding

我想创建一个由Soid

过滤的列表

基本上我有2种名单:1名员工,2项交易

Employees got EmpID and Name
Transactions got `ID` , EmpID , and TransDate

我想过滤这样的事情:data-bind="foreach: $data.Transactions(EmpID )">

使用自定义绑定,是否可能?

类似这样的事情

<table>
        <tbody data-bind="foreach: Employees, visible: Employees().length > 0">  
            <tr>                
                <td class="centerdata" data-bind="text: ID"></td>
                <td class="centerdata" data-bind="text: Name"></td>
                <td>
                   <table>
                       <tbody data-bind="foreach: $data.Transactions">  
                           <tr>   
                              <td data-bind="text:TransDate"></td>
                           </tr>
                       </tbody>
                   </table>
                </td>
            </tr>                    
        </tbody>
   </table>

这就是我累了:http://jsfiddle.net/bxfXd/2237/

1 个答案:

答案 0 :(得分:0)

所以,这将工作:

var employees  =  [{EmpID : 0, Name: 'John' }];
var transactions   =  [{ID  : 1, TransDate: '1/1/2013', EmployeeID :0}];

ko.utils.arrayForEach(employees , function(e) {
    e.Transactions = ko.utils.arrayFilter(transactions, function(t){
        return t.EmployeeID == e.EmpID;
    });
});

var VM  = function(){
    var  self = this;
    self.Employees = employees;
    self.getEmployee = function(empID) {
        for(var index = 0; index; self.Employees.length; index++ ) {
        if(self.Employees[index].EmpID == empID)
                return self.Employees[index]
        }
    return null;
    };
};

var vm = new VM();

正如您所见,这会循环通过员工并创建一个包含所有所有交易的交易属性。

那个观点:

<table>
    <tbody data-bind="foreach: Employees, visible: Employees.length > 0">  
        <tr>                
            <td class="centerdata" data-bind="text: ID"></td>
            <td class="centerdata" data-bind="text: Name"></td>
            <td>
               <table>
                   <tbody data-bind="foreach: $data.Transactions">  
                       <tr>   
                          <td data-bind="text:TransDate"></td>
                       </tr>
                   </tbody>
               </table>
            </td>
        </tr>                    
    </tbody>

您无需创建自定义绑定即可按员工对转化进行分组。 因为分组过程已经由foreach和arrayFilter完成。 所以,没有必要通过EmpID。 实际上,进行分组过程的唯一方法是重构Employees(作为根)和Transactions(作为叶子)的层次结构。

我希望它有所帮助。