Cascading selects AngularJS filter 第二次不显示数据
Cascading selects AngularJS filter not display data in second time
考虑以下代码:
<html ng-app="app">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"></script>
</head>
<body ng-controller="appCtrl">
<div class="filters">
<div>
Color: <select id="color" ng-model="colorfilter" ng-options="car.color as car.color for car in cars | unique:'color'" ng-change="changeColor()">
</select>
Model: <select id="model" ng-disabled="!colorfilter" ng-model="modelfilter" ng-options="car.model as car.model for car in cars | filter:{color:colorfilter} | unique:'model'" ng-change="changeModel()">
</select>
</div>
</div>
<div class="list">
<p class="car" ng-repeat="car in cars | filter:colorfilter | filter:modelfilter">{{car.make}} :: {{car.model}} | {{car.color}}</p>
</div>
</body>
</html>
和 controller.js:
angular.module('app', [])
.filter('unique', function() {
return function(input, key) {
var unique = {};
var uniqueList = [];
for(var i = 0; i < input.length; i++){
if(typeof unique[input[i][key]] == "undefined"){
unique[input[i][key]] = "";
uniqueList.push(input[i]);
}
}
return uniqueList;
};
})
.controller('appCtrl', function($scope) {
// define list of cars
$scope.cars = [
{make:"Dodge", color:"Blue", model:"Dakota"},
{make:"Chevy", color:"Black", model:"Aveo"},
{make:"Honda", color:"Black", model:"Accord"},
{make:"Toyota", color:"Red", model:"Corolla"}
//... other lines
];
// initialize filter object
$scope.filter = {};
});
汽车列表完整显示在 select 字段下方。当我第一次过滤时,第一个 select 通常会过滤汽车列表(考虑 selected 颜色)和第二个 select 数据(仅具有 select编辑颜色)。第二个 select 还过滤了考虑 selected 模型的汽车列表。听起来很完美!
但是,当我尝试执行新的过滤器时,当我选择另一种颜色时,它不会显示汽车列表中的任何记录,但通常通过过滤第二个的数据来工作select .通过选择第二个 select 中可用的模型之一,显示列表,正好是两个 select 离子的组合(例如 select 的 AND)。
第一个select好像只考虑当前正在屏幕上查看的列表数据,需要等待第二个select显示结果。但我的意图是向每个过滤器显示结果,始终搜索完整的项目列表。
我在 Codepen 上的完整代码。
更新:
您需要为 modelFilter
设置 null
值以重置过滤器。
您的代码工作正常,但是当您 select 第二个下拉列表中的值时,您将该值设置为 modelfilter
,这导致了问题。
尝试在两个下拉菜单中插入一个空的下拉选项,这样当您select第一个下拉菜单时它将重置为默认状态并且modelFilter
不会应用。
工作演示:
我想这可能就是您要找的。根据您的 ng-disabled 逻辑,我认为您希望用户始终按照选择颜色然后选择型号的顺序进行操作。
https://codepen.io/Cameron64/pen/YZbrqW?editors=1010
为了保持此顺序,我将颜色下拉菜单设置为在从中选择模型下拉菜单时重置。此外,我将过滤器分组到一个对象中,这样当它传递给转发器时就不会那么冗长
$scope.changeColor = function() {
$scope.filter.model = undefined;
$scope.filter.color = $scope.filter.color || undefined;
}
考虑以下代码:
<html ng-app="app">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"></script>
</head>
<body ng-controller="appCtrl">
<div class="filters">
<div>
Color: <select id="color" ng-model="colorfilter" ng-options="car.color as car.color for car in cars | unique:'color'" ng-change="changeColor()">
</select>
Model: <select id="model" ng-disabled="!colorfilter" ng-model="modelfilter" ng-options="car.model as car.model for car in cars | filter:{color:colorfilter} | unique:'model'" ng-change="changeModel()">
</select>
</div>
</div>
<div class="list">
<p class="car" ng-repeat="car in cars | filter:colorfilter | filter:modelfilter">{{car.make}} :: {{car.model}} | {{car.color}}</p>
</div>
</body>
</html>
和 controller.js:
angular.module('app', [])
.filter('unique', function() {
return function(input, key) {
var unique = {};
var uniqueList = [];
for(var i = 0; i < input.length; i++){
if(typeof unique[input[i][key]] == "undefined"){
unique[input[i][key]] = "";
uniqueList.push(input[i]);
}
}
return uniqueList;
};
})
.controller('appCtrl', function($scope) {
// define list of cars
$scope.cars = [
{make:"Dodge", color:"Blue", model:"Dakota"},
{make:"Chevy", color:"Black", model:"Aveo"},
{make:"Honda", color:"Black", model:"Accord"},
{make:"Toyota", color:"Red", model:"Corolla"}
//... other lines
];
// initialize filter object
$scope.filter = {};
});
汽车列表完整显示在 select 字段下方。当我第一次过滤时,第一个 select 通常会过滤汽车列表(考虑 selected 颜色)和第二个 select 数据(仅具有 select编辑颜色)。第二个 select 还过滤了考虑 selected 模型的汽车列表。听起来很完美!
但是,当我尝试执行新的过滤器时,当我选择另一种颜色时,它不会显示汽车列表中的任何记录,但通常通过过滤第二个的数据来工作select .通过选择第二个 select 中可用的模型之一,显示列表,正好是两个 select 离子的组合(例如 select 的 AND)。
第一个select好像只考虑当前正在屏幕上查看的列表数据,需要等待第二个select显示结果。但我的意图是向每个过滤器显示结果,始终搜索完整的项目列表。
我在 Codepen 上的完整代码。
更新:
您需要为 modelFilter
设置 null
值以重置过滤器。
您的代码工作正常,但是当您 select 第二个下拉列表中的值时,您将该值设置为 modelfilter
,这导致了问题。
尝试在两个下拉菜单中插入一个空的下拉选项,这样当您select第一个下拉菜单时它将重置为默认状态并且modelFilter
不会应用。
工作演示:
我想这可能就是您要找的。根据您的 ng-disabled 逻辑,我认为您希望用户始终按照选择颜色然后选择型号的顺序进行操作。
https://codepen.io/Cameron64/pen/YZbrqW?editors=1010
为了保持此顺序,我将颜色下拉菜单设置为在从中选择模型下拉菜单时重置。此外,我将过滤器分组到一个对象中,这样当它传递给转发器时就不会那么冗长
$scope.changeColor = function() {
$scope.filter.model = undefined;
$scope.filter.color = $scope.filter.color || undefined;
}