0

Soid でフィルタリングされたリストを 1 つ作成したい

基本的に私は 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/

4

1 に答える 1

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();

ご覧のとおり、これは従業員をループして、所属するすべてのトランザクションを含む Transactions プロパティを作成します。

そして、そのビュー:

<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 を渡す必要はありません。実際、グループ化プロセスを実行する唯一のことは、従業員 (ルートとして) とトランザクション (リーフとして) の階層を再構築することです。

お役に立てば幸いです。

于 2013-05-31T11:39:36.477 に答える