简体   繁体   English

下拉列表选择过滤器

[英]Dropdown list selecting a filter

I'm trying to get every properties of a json object in order to create a dropdown list. 我试图获取json对象的每个属性,以创建一个下拉列表。

I'm going to explain myself, for example : 我将解释自己,例如:

I've got 2 json objects : 我有2个json对象:

{"name":"Paul","age":"18","sport":"Basket","color":"Green"}
{"name":"Jhon","age":"20","sport":"Basket","fruit":"banana", "number":"5"}

I've got a dropdown list within {name,age,sport,color,fruit,number} . 我在{name,age,sport,color,fruit,number}有一个下拉列表。 If I select name, I've got a second dropdown list within {Paul,Jhon} . 如果选择名称,那么{Paul,Jhon}有第二个下拉列表。

I'm using AngularJS, Node.js 我正在使用AngularJS,Node.js

I know that after getting every properties I have to apply unicity filter, to only have the differents properties but not the occurence 我知道在获得所有属性后,我必须应用唯一性过滤器,才能仅具有differents属性,而没有出现

Assuming ES6 is good and we can use Set to return unique values (if no - you can use some other techniques to get an array with unique elements ) you can use ngChange directive to detect changes of the first select and populated options for the second select. 假设ES6很好,我们可以使用Set返回唯一值(如果否,则可以使用其他技术来获取具有唯一元素的数组 ),可以使用ngChange指令来检测第一个选择的更改以及第二个选择的填充选项。 So the controller and markup will look like: 因此,控制器和标记将如下所示:

 angular.module('myApp', []) .controller('MyCtrl', function MyCtrl($scope) { var ctrl = this; var data = [ {"name":"Paul","age":"18","sport":"Basket","color":"Green"}, {"name":"Jhon","age":"20","sport":"Basket","fruit":"banana", "number":"5"}, {"name":"Mark","age":"22","sport":"Football","color":"Red", "number":"5"} ]; ctrl.objKeys = getUniqueKeys(data); ctrl.objVals = []; ctrl.keyChanged = keyChanged; function keyChanged(key) { ctrl.objVals = getUnique(data.map(function(obj) { return obj[key] }).filter(function(obj) { return !!obj; })); //get the values and filter only the ones are defined } function getUnique(arr) { return [...new Set(arr)]; //get array with unique values } function getUniqueKeys(arr) { return getUnique([].concat.apply([], arr.map(function(obj) { return Object.keys(obj); }))); //get the property names } return ctrl; }); 
 <script src="//code.angularjs.org/1.6.2/angular.js"></script> <div ng-app="myApp"> <div ng-controller="MyCtrl as $ctrl"> <select ng-model="objKey" ng-change="$ctrl.keyChanged(objKey)" ng-options="k for k in $ctrl.objKeys track by k"></select> <select ng-if="$ctrl.objVals.length" ng-model="objVal" ng-options="k for k in $ctrl.objVals track by k"></select> </div> </div> 

May not be perfect but it is working 可能不是完美的,但是正在工作

HTML: HTML:

 <div ng-controller="MyCtrl">
      <select ng-model="selectedItem" ng-change="itemChanged()" ng-options="item for item in list1">
      </select>
      <select ng-model="second" ng-options="lst for lst in list2 "></select>

 </div>

Controller: 控制器:

var myApp = angular.module('myApp', []);

myApp.controller('MyCtrl', function MyCtrl($scope) {
$scope.list1 = ["name","age","sport","color","fruit","number"];
$scope.data = [{"name":"Paul","age":"18","sport":"Basket","color":"Green"},{"name":"Jhon","age":"20","sport":"Basket","fruit":"banana", "number":"5"}];
  $scope.itemChanged = function() {
   var prop = $scope.selectedItem;     
   $scope.list2 = [];
   $scope.data.forEach(x => {
     if(x[prop] && $scope.list2.indexOf(x[prop])) {
       $scope.list2.push(x[prop]);
     }      
   });
  };
});

Jsfiddle Demo: http://jsfiddle.net/sathvike/vzzmrnvL/ Jsfiddle演示: http : //jsfiddle.net/sathvike/vzzmrnvL/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM