javascript - ng-repeat 基于选择值的深层属性过滤器

标签 javascript angularjs json angularjs-ng-repeat

我是 Angular JS 新手,我正在尝试根据所选值过滤数据。 我已经完成了这个例子Plunker .
那么,如何根据深层属性过滤数据呢? Deep Property Filter Plunker

// Code goes here

angular.module('app', [])
.controller('Main', ['$scope', function ($scope) {
    $scope.title = "Filter Based on Select Value";
   
    $scope.orders = [
                      {
                          "SalesPersonViewModel": {
                              "SalesPersonId": 1,
                              "Fname": "Nir",
                              "LName": "Adam"
                          },
         
                          "PackagesViewModel": [
                            {
                                "OrderId": 2,
                                "PlatformId": 1,
                                "RemarkId": 1,
                                "NeedBy": "2016-02-17T00:00:00",
                                "Closed": null,
                                "PlannerViewModel": {
                                    "PlannerId": 1,
                                    "FName": "Nadav",
                                    "LName": "Baron",
                                    "InDate": "2016-01-21T16:09:44.56",
                                    "OutDate": null,
                                    "IsEnable": true
                                },
                                "PlatformViewModel": {
                                    "PlatformId": 1,
                                    "Name": "Mediant 1000"
                                },
                                "RemarkViewModel": {
                                    "RemarkId": 1,
                                    "RemarkHeaderId": 11,
                                    "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
                                    "RemarkHeaderViewModel": {
                                        "RemarkHeaderId": 11,
                                        "Header": "Planning Instructions - Internal",
                                        "ParentRemarkHeader": 10
                                    }
                                },
                                "PackageItemsViewModel": [
                                  {
                                      "PackageItemId": 1,
                                      "PackageId": 1,
                                      "ItemId": 1,
                                      "Quantity": 1000000,
                                      "UnitPrice": 2,
                                      "ItemViewModel": {
                                          "ItemId": 1,
                                          "ItemCode": "GTPM00683",
                                          "CPN": "M1KB-ESBC-5",
                                          "Description": "Mediant 1000B Enterprise"
                                      }
                                  },
                                  {
                                      "PackageItemId": 2,
                                      "PackageId": 1,
                                      "ItemId": 4,
                                      "Quantity": 3,
                                      "UnitPrice": 23,
                                      "ItemViewModel": {
                                          "ItemId": 4,
                                          "ItemCode": "GGWV00564",
                                          "CPN": "M8K/REV2/BA",
                                          "Description": "AudioCodes 420HD IP Phone"
                                      }
                                  },
                                  {
                                      "PackageItemId": 3,
                                      "PackageId": 1,
                                      "ItemId": 3,
                                      "Quantity": 3,
                                      "UnitPrice": 42,
                                      "ItemViewModel": {
                                          "ItemId": 3,
                                          "ItemCode": "GTPM00057",
                                          "CPN": null,
                                          "Description": "Power Cord AC3 Wire IEC-320"
                                      }
                                  }
                                ],
                                "PackageId": 1,
                                "PlannerId": 1,
                                "ApplyToAll": false,
                                "ShippingOrganizationId": null,
                                "Schedule": "2016-03-09T00:00:00"
                            },
                            {
                                "OrderId": 2,
                                "PlatformId": 1,
                                "RemarkId": 1,
                                "NeedBy": "2016-03-12T00:00:00",
                                "Closed": null,
                                "PlannerViewModel": {
                                    "PlannerId": 2,
                                    "FName": "Adi",
                                    "LName": "Ezra",
                                    "InDate": "2016-01-22T17:51:01.65",
                                    "OutDate": null,
                                    "IsEnable": true
                                },
                                "PlatformViewModel": {
                                    "PlatformId": 1,
                                    "Name": "Mediant 1000"
                                },
                                "RemarkViewModel": {
                                    "RemarkId": 1,
                                    "RemarkHeaderId": 11,
                                    "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
                                    "RemarkHeaderViewModel": {
                                        "RemarkHeaderId": 11,
                                        "Header": "Planning Instructions - Internal",
                                        "ParentRemarkHeader": 10
                                    }
                                },
                                "PackageItemsViewModel": [
                                  {
                                      "PackageItemId": 6,
                                      "PackageId": 4,
                                      "ItemId": 4,
                                      "Quantity": 8,
                                      "UnitPrice": 8,
                                      "ItemViewModel": {
                                          "ItemId": 4,
                                          "ItemCode": "GGWV00564",
                                          "CPN": "M8K/REV2/BA",
                                          "Description": "AudioCodes 420HD IP Phone"
                                      }
                                  },
                                  {
                                      "PackageItemId": 7,
                                      "PackageId": 4,
                                      "ItemId": 5,
                                      "Quantity": 8,
                                      "UnitPrice": 67,
                                      "ItemViewModel": {
                                          "ItemId": 5,
                                          "ItemCode": "LBLZ01589",
                                          "CPN": null,
                                          "Description": "LBL CPN:OP420HDE/GNS"
                                      }
                                  }
                                ],
                                "PackageId": 4,
                                "PlannerId": 2,
                                "ApplyToAll": false,
                                "ShippingOrganizationId": 4,
                                "Schedule": "2016-03-01T00:00:00"
                            }
                          ],
                          "OrderId": 2
                      },
                      {
                          "SalesPersonViewModel": {
                              "SalesPersonId": 1,
                              "Fname": "Nir",
                              "LName": "Adam"
                          },
                         
                          "PackagesViewModel": [
                            {
                                "OrderId": 3,
                                "PlatformId": 2,
                                "RemarkId": 1,
                                "NeedBy": "2017-03-18T00:00:00",
                                "Closed": null,
                                "PlannerViewModel": {
                                    "PlannerId": 2,
                                    "FName": "Adi",
                                    "LName": "Ezra",
                                    "InDate": "2016-01-22T17:51:01.65",
                                    "OutDate": null,
                                    "IsEnable": true
                                },
                                "PlatformViewModel": {
                                    "PlatformId": 2,
                                    "Name": "IP Phone"
                                },
                                "RemarkViewModel": {
                                    "RemarkId": 1,
                                    "RemarkHeaderId": 11,
                                    "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
                                    "RemarkHeaderViewModel": {
                                        "RemarkHeaderId": 11,
                                        "Header": "Planning Instructions - Internal",
                                        "ParentRemarkHeader": 10
                                    }
                                },
                                "PackageItemsViewModel": [
                                  {
                                      "PackageItemId": 8,
                                      "PackageId": 8,
                                      "ItemId": 7,
                                      "Quantity": 2,
                                      "UnitPrice": 1,
                                      "ItemViewModel": {
                                          "ItemId": 7,
                                          "ItemCode": "RACR00036",
                                          "CPN": "MKCR0036",
                                          "Description": "RAC Ticket Counter Waiting machine EPBX RJ45 KAT 447 Underground"
                                      }
                                  },
                                  {
                                      "PackageItemId": 9,
                                      "PackageId": 8,
                                      "ItemId": 3,
                                      "Quantity": 1,
                                      "UnitPrice": 5,
                                      "ItemViewModel": {
                                          "ItemId": 3,
                                          "ItemCode": "GTPM00057",
                                          "CPN": null,
                                          "Description": "Power Cord AC3 Wire IEC-320"
                                      }
                                  },
                                  {
                                      "PackageItemId": 10,
                                      "PackageId": 8,
                                      "ItemId": 4,
                                      "Quantity": 3,
                                      "UnitPrice": 5,
                                      "ItemViewModel": {
                                          "ItemId": 4,
                                          "ItemCode": "GGWV00564",
                                          "CPN": "M8K/REV2/BA",
                                          "Description": "AudioCodes 420HD IP Phone"
                                      }
                                  }
                                ],
                                "PackageId": 8,
                                "PlannerId": 2,
                                "ApplyToAll": false,
                                "ShippingOrganizationId": null,
                                "Schedule": null
                            },
                            {
                                "OrderId": 3,
                                "PlatformId": 2,
                                "RemarkId": 1,
                                "NeedBy": "2017-03-18T00:00:00",
                                "Closed": null,
                                "PlannerViewModel": {
                                    "PlannerId": 1,
                                    "FName": "Nadav",
                                    "LName": "Baron",
                                    "InDate": "2016-01-21T16:09:44.56",
                                    "OutDate": null,
                                    "IsEnable": true
                                },
                                "PlatformViewModel": {
                                    "PlatformId": 2,
                                    "Name": "IP Phone"
                                },
                                "RemarkViewModel": {
                                    "RemarkId": 1,
                                    "RemarkHeaderId": 11,
                                    "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
                                    "RemarkHeaderViewModel": {
                                        "RemarkHeaderId": 11,
                                        "Header": "Planning Instructions - Internal",
                                        "ParentRemarkHeader": 10
                                    }
                                },
                                "PackageItemsViewModel": [
                                  {
                                      "PackageItemId": 12,
                                      "PackageId": 9,
                                      "ItemId": 2,
                                      "Quantity": 3,
                                      "UnitPrice": 6,
                                      "ItemViewModel": {
                                          "ItemId": 2,
                                          "ItemCode": "GTPM00056",
                                          "CPN": "M1K-VM-4FXS",
                                          "Description": "M1K SMX-1_4FXS_Voice"
                                      }
                                  }
                                ],
                                "PackageId": 9,
                                "PlannerId": 1,
                                "ApplyToAll": false,
                                "ShippingOrganizationId": 2,
                                "Schedule": "2016-02-27T00:00:00"
                            }
                          ],
                          "OrderId": 3
                      }
    ],
    $scope.platforms = [
                        { "PlatformId": 1, "Name": 'Mediant 1000' },
                        { "PlatformId": 2, "Name": 'IP Phone' }
                       ]
}]);
/* Styles go here */

td, th{
  border:1px solid #CCC;
}
td > div{border:1px solid #EEE;}
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
     <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body ng-app="app" ng-controller="Main">
    <div>
        {{title}}
        <br/>
        <br />
        <select name="show-filter" ng-model="pfFilter"
                ng-options="Name as platform.Name for platform in platforms track by platform.PlatformId"></select>
        <br />
        <br/>
       <div>
           <div >
               <table>
                   <thead>
                       <tr>
                           <th>Order Id</th>
                           <th>Platform</th>
                       </tr>
                   </thead>
                   <tbody>
                       <tr ng-repeat="o in orders | filter:{PlatformId :pfFilter.PackagesViewModel.PlatformViewModel.PlatformId}">
                           <td>{{o.OrderId}}</td>
                           <td>
                                    <div ng-repeat="p in o.PackagesViewModel">{{p.PlatformViewModel.PlatformId}} : {{p.PlatformViewModel.Name}}</div>
                           </td>
                       </tr>
                   </tbody>
               </table>
           </div>
       </div>
    </div>
  
</body>

</html>

最佳答案

doc你可以找到下一行

Note: that a named property will match properties on the same level only, while the special $ property will match properties on the same level or deeper. E.g. an array item like {name: {first: 'John', last: 'Doe'}} will not be matched by {name: 'John'}, but will be matched by {$: 'John'}.

所以,在你的情况下,你不能按照你的意愿使用它。
但是,您可以使用

function(value, index, array): A predicate function can be used to write arbitrary filters. The function is called for each element of the array, with the element, its index, and the entire array itself as arguments.

像这样

$scope.comparer = function(o) {
  if (!$scope.pfFilter) return o;
  return o.PackagesViewModel.filter(function(el) {
    return el.PlatformId == $scope.pfFilter.PlatformId
  }).length;
}

完整示例:

// Code goes here

angular.module('app', [])
  .controller('Main', ['$scope', function($scope) {
    $scope.title = "Filter Based on Select Value";

    $scope.orders = [{
        "SalesPersonViewModel": {
          "SalesPersonId": 1,
          "Fname": "Nir",
          "LName": "Adam"
        },

        "PackagesViewModel": [{
          "OrderId": 2,
          "PlatformId": 1,
          "RemarkId": 1,
          "NeedBy": "2016-02-17T00:00:00",
          "Closed": null,
          "PlannerViewModel": {
            "PlannerId": 1,
            "FName": "Nadav",
            "LName": "Baron",
            "InDate": "2016-01-21T16:09:44.56",
            "OutDate": null,
            "IsEnable": true
          },
          "PlatformViewModel": {
            "PlatformId": 1,
            "Name": "Mediant 1000"
          },
          "RemarkViewModel": {
            "RemarkId": 1,
            "RemarkHeaderId": 11,
            "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
            "RemarkHeaderViewModel": {
              "RemarkHeaderId": 11,
              "Header": "Planning Instructions - Internal",
              "ParentRemarkHeader": 10
            }
          },
          "PackageItemsViewModel": [{
            "PackageItemId": 1,
            "PackageId": 1,
            "ItemId": 1,
            "Quantity": 1000000,
            "UnitPrice": 2,
            "ItemViewModel": {
              "ItemId": 1,
              "ItemCode": "GTPM00683",
              "CPN": "M1KB-ESBC-5",
              "Description": "Mediant 1000B Enterprise"
            }
          }, {
            "PackageItemId": 2,
            "PackageId": 1,
            "ItemId": 4,
            "Quantity": 3,
            "UnitPrice": 23,
            "ItemViewModel": {
              "ItemId": 4,
              "ItemCode": "GGWV00564",
              "CPN": "M8K/REV2/BA",
              "Description": "AudioCodes 420HD IP Phone"
            }
          }, {
            "PackageItemId": 3,
            "PackageId": 1,
            "ItemId": 3,
            "Quantity": 3,
            "UnitPrice": 42,
            "ItemViewModel": {
              "ItemId": 3,
              "ItemCode": "GTPM00057",
              "CPN": null,
              "Description": "Power Cord AC3 Wire IEC-320"
            }
          }],
          "PackageId": 1,
          "PlannerId": 1,
          "ApplyToAll": false,
          "ShippingOrganizationId": null,
          "Schedule": "2016-03-09T00:00:00"
        }, {
          "OrderId": 2,
          "PlatformId": 1,
          "RemarkId": 1,
          "NeedBy": "2016-03-12T00:00:00",
          "Closed": null,
          "PlannerViewModel": {
            "PlannerId": 2,
            "FName": "Adi",
            "LName": "Ezra",
            "InDate": "2016-01-22T17:51:01.65",
            "OutDate": null,
            "IsEnable": true
          },
          "PlatformViewModel": {
            "PlatformId": 1,
            "Name": "Mediant 1000"
          },
          "RemarkViewModel": {
            "RemarkId": 1,
            "RemarkHeaderId": 11,
            "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
            "RemarkHeaderViewModel": {
              "RemarkHeaderId": 11,
              "Header": "Planning Instructions - Internal",
              "ParentRemarkHeader": 10
            }
          },
          "PackageItemsViewModel": [{
            "PackageItemId": 6,
            "PackageId": 4,
            "ItemId": 4,
            "Quantity": 8,
            "UnitPrice": 8,
            "ItemViewModel": {
              "ItemId": 4,
              "ItemCode": "GGWV00564",
              "CPN": "M8K/REV2/BA",
              "Description": "AudioCodes 420HD IP Phone"
            }
          }, {
            "PackageItemId": 7,
            "PackageId": 4,
            "ItemId": 5,
            "Quantity": 8,
            "UnitPrice": 67,
            "ItemViewModel": {
              "ItemId": 5,
              "ItemCode": "LBLZ01589",
              "CPN": null,
              "Description": "LBL CPN:OP420HDE/GNS"
            }
          }],
          "PackageId": 4,
          "PlannerId": 2,
          "ApplyToAll": false,
          "ShippingOrganizationId": 4,
          "Schedule": "2016-03-01T00:00:00"
        }],
        "OrderId": 2
      }, {
        "SalesPersonViewModel": {
          "SalesPersonId": 1,
          "Fname": "Nir",
          "LName": "Adam"
        },

        "PackagesViewModel": [{
          "OrderId": 3,
          "PlatformId": 2,
          "RemarkId": 1,
          "NeedBy": "2017-03-18T00:00:00",
          "Closed": null,
          "PlannerViewModel": {
            "PlannerId": 2,
            "FName": "Adi",
            "LName": "Ezra",
            "InDate": "2016-01-22T17:51:01.65",
            "OutDate": null,
            "IsEnable": true
          },
          "PlatformViewModel": {
            "PlatformId": 2,
            "Name": "IP Phone"
          },
          "RemarkViewModel": {
            "RemarkId": 1,
            "RemarkHeaderId": 11,
            "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
            "RemarkHeaderViewModel": {
              "RemarkHeaderId": 11,
              "Header": "Planning Instructions - Internal",
              "ParentRemarkHeader": 10
            }
          },
          "PackageItemsViewModel": [{
            "PackageItemId": 8,
            "PackageId": 8,
            "ItemId": 7,
            "Quantity": 2,
            "UnitPrice": 1,
            "ItemViewModel": {
              "ItemId": 7,
              "ItemCode": "RACR00036",
              "CPN": "MKCR0036",
              "Description": "RAC Ticket Counter Waiting machine EPBX RJ45 KAT 447 Underground"
            }
          }, {
            "PackageItemId": 9,
            "PackageId": 8,
            "ItemId": 3,
            "Quantity": 1,
            "UnitPrice": 5,
            "ItemViewModel": {
              "ItemId": 3,
              "ItemCode": "GTPM00057",
              "CPN": null,
              "Description": "Power Cord AC3 Wire IEC-320"
            }
          }, {
            "PackageItemId": 10,
            "PackageId": 8,
            "ItemId": 4,
            "Quantity": 3,
            "UnitPrice": 5,
            "ItemViewModel": {
              "ItemId": 4,
              "ItemCode": "GGWV00564",
              "CPN": "M8K/REV2/BA",
              "Description": "AudioCodes 420HD IP Phone"
            }
          }],
          "PackageId": 8,
          "PlannerId": 2,
          "ApplyToAll": false,
          "ShippingOrganizationId": null,
          "Schedule": null
        }, {
          "OrderId": 3,
          "PlatformId": 2,
          "RemarkId": 1,
          "NeedBy": "2017-03-18T00:00:00",
          "Closed": null,
          "PlannerViewModel": {
            "PlannerId": 1,
            "FName": "Nadav",
            "LName": "Baron",
            "InDate": "2016-01-21T16:09:44.56",
            "OutDate": null,
            "IsEnable": true
          },
          "PlatformViewModel": {
            "PlatformId": 2,
            "Name": "IP Phone"
          },
          "RemarkViewModel": {
            "RemarkId": 1,
            "RemarkHeaderId": 11,
            "RemarkBody": "Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments. Customer will not accept any partial shipments.",
            "RemarkHeaderViewModel": {
              "RemarkHeaderId": 11,
              "Header": "Planning Instructions - Internal",
              "ParentRemarkHeader": 10
            }
          },
          "PackageItemsViewModel": [{
            "PackageItemId": 12,
            "PackageId": 9,
            "ItemId": 2,
            "Quantity": 3,
            "UnitPrice": 6,
            "ItemViewModel": {
              "ItemId": 2,
              "ItemCode": "GTPM00056",
              "CPN": "M1K-VM-4FXS",
              "Description": "M1K SMX-1_4FXS_Voice"
            }
          }],
          "PackageId": 9,
          "PlannerId": 1,
          "ApplyToAll": false,
          "ShippingOrganizationId": 2,
          "Schedule": "2016-02-27T00:00:00"
        }],
        "OrderId": 3
      }],
      $scope.platforms = [{
        "PlatformId": 1,
        "Name": 'Mediant 1000'
      }, {
        "PlatformId": 2,
        "Name": 'IP Phone'
      }]

    $scope.comparer = function(o) {
      if (!$scope.pfFilter) return o;
      return o.PackagesViewModel.filter(function(el) {
        return el.PlatformId == $scope.pfFilter.PlatformId
      }).length;
    }
  }]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>
<div ng-app="app" ng-controller="Main">
  <div>
    {{title}}
    <br/>
    <br />
    <select name="show-filter" ng-model="pfFilter" ng-options="platform.Name for platform in platforms track by platform.PlatformId"></select>
    <br />
    <br/>
    <div>
      <div>
        <table>
          <thead>
            <tr>
              <th>Order Id</th>
              <th>Platform</th>
            </tr>
          </thead>
          <tbody>
            <tr ng-repeat="o in orders | filter:comparer">
              <td>{{o.OrderId}}</td>
              <td>
                <div ng-repeat="p in o.PackagesViewModel">{{p.PlatformViewModel.PlatformId}} : {{p.PlatformViewModel.Name}}</div>
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>

</div>

关于javascript - ng-repeat 基于选择值的深层属性过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35239004/

相关文章:

javascript - Firebug 在 ajax 调用后停止 window.location

javascript - <Script> 标签内的 HTML 代码

javascript - 在 javascript 中,为什么当我使用 <p> 标签时,会显示结果。但是当我使用输入文本时,结果并没有像我预期的那样显示

angularjs - 在 Angular 中向 MongoDB 发送和获取图像

json - 想要在perl中读取JSON文件字符串(多个值)

ios - 如何从 OMDb API 网络服务获取数据

javascript - Next.js 中的 Trustpilot TrustBox

angularjs - 使用angular js从选择中动态过滤掉值

javascript - 当 promise 解析时,AngularJS 不显示数据

android无法解析json数据android