javascript - 如何根据该json数组中的特定属性和angular js中其他下拉列表的ng-model值过滤ng-repeat中的数组
问题描述
我想使用 angularJS 根据他们的酋长国列出城市。这意味着当从一个下拉列表中选择一个酋长国时,城市下拉列表将使用ng-model
emirate 的值进行过滤。但问题是过滤工作,但一些城市的唯一 ID 与区域 ID 匹配。例如,如果我从 emirate 下拉列表中选择“Ras al-Khaimah”,则其城市“Ras al-Khaimah”出现在城市下拉列表中,但“Fujairah”也出现在那里,因为“Fujairah”的唯一 ID 与唯一 ID 相同“Ras al-Khaimah”的 ID。那么如何使用 emirateng-repeat
的ng-model
值过滤城市 JSON 数组的特定字段呢?请检查我的 JSON 数组,我的代码是:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.emriates = [
{ "region_id": "1", "region_name": "Abu Dhabi" },
{ "region_id": "2", "region_name": "Ajman" },
{ "region_id": "3", "region_name": "Dubai" },
{ "region_id": "4", "region_name": "Fujairah" },
{ "region_id": "5", "region_name": "Ras al-Khaimah" },
{ "region_id": "6", "region_name": "Sharja" },
{ "region_id": "7", "region_name": "Umm al-Quwain" }
];
$scope.cities = [
{ "city_id": "2", "region_id": "1", "city_name": "Abudhabi" },
{ "city_id": "3", "region_id": "3", "city_name": "Dubai" },
{ "city_id": "4", "region_id": "2", "city_name": "Ajman" },
{ "city_id": "5", "region_id": "4", "city_name": "Fujairah" },
{ "city_id": "6", "region_id": "5", "city_name": "Ras al-Khaimah" },
{ "city_id": "7", "region_id": "6", "city_name": "Sharja" },
{ "city_id": "8", "region_id": "7", "city_name": "Umm al-Quwain" },
{ "city_id": "9", "region_id": "1", "city_name": "Al Ain" },
{ "city_id": "10", "region_id": "3", "city_name": "Jabel Ali" },
{ "city_id": "11", "region_id": "6", "city_name": "kalba" },
{ "city_id": "13", "region_id": "3", "city_name": "Jumeirah" },
{ "city_id": "14", "region_id": "3", "city_name": "Musaffah" }
];
});
</script>
<html>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div>
<label>Emirate
<select ng-model="emriate">
<option value="">-Select-</option>
<option ng-repeat="emt in emriates" value="{emt.region_id}}">
{{emt.region_name}}
</option>
</select>
</label>
</div>
<div style="margin-top: 10px;">
<label>City
<select ng-model="city">
<option value="">-Select-</option>
<option ng-repeat="cit in cities | filter:emriate" value="{cit.city_id}}">
{{cit.city_name}}
</option>
</select>
</label>
</div>
</div>
</body>
</html>
解决方案
我认为您只想使用更准确的过滤器;)
你想使用filter:{'region_id': emriate}
而不是filter:emriate
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.emriates=[
{ "region_id": "1", "region_name": "Abu Dhabi" },
{ "region_id": "2", "region_name": "Ajman" },
{ "region_id": "3", "region_name": "Dubai" },
{ "region_id": "4", "region_name": "Fujairah" },
{ "region_id": "5", "region_name": "Ras al-Khaimah" },
{ "region_id": "6", "region_name": "Sharja" },
{ "region_id": "7", "region_name": "Umm al-Quwain" }
];
$scope.cities=[
{ "city_id": "2", "region_id": "1", "city_name": "Abudhabi" },
{ "city_id": "3", "region_id": "3", "city_name": "Dubai" },
{ "city_id": "4", "region_id": "2", "city_name": "Ajman" },
{ "city_id": "5", "region_id": "4", "city_name": "Fujairah" },
{ "city_id": "6", "region_id": "5", "city_name": "Ras al-Khaimah" },
{ "city_id": "7", "region_id": "6", "city_name": "Sharja" },
{ "city_id": "8", "region_id": "7", "city_name": "Umm al-Quwain" },
{ "city_id": "9", "region_id": "1", "city_name": "Al Ain" },
{ "city_id": "10", "region_id": "3", "city_name": "Jabel Ali" },
{ "city_id": "11", "region_id": "6", "city_name": "kalba" },
{ "city_id": "13", "region_id": "3", "city_name": "Jumeirah" },
{ "city_id": "14", "region_id": "3", "city_name": "Musaffah" },
{ "city_id": "15", "region_id": "10", "city_name": "Error 1" }
];
$scope.exactFilter = function(value) {
return value.region_id === $scope.emriate;
};
});
</script>
<htmL>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div>
<label>Emriate
<select ng-model="emriate">
<option value="">-Select-</option>
<option ng-repeat="emt in emriates" value="{{emt.region_id}}">{{emt.region_name}}</option>
</select>
</label>
</div>
<div style="margin-top: 10px;">
<label>City
<select ng-model="city">
<option value="">-Select-</option>
<option ng-repeat="cit in cities | filter:exactFilter" value="{{cit.city_id}}">{{cit.city_name}}</option>
</select>
</label>
</div>
</div>
</body>
</htmL>
根据文档(https://docs.angularjs.org/api/ng/filter/filter),如果您使用字符串作为过滤器输入,则每个属性都可以用于匹配该字符串引用的值,因此您想要通过一个对象来传递一个更精确的过滤器来指定执行过滤的格式。
编辑
这是解决方案:只需在您的范围内添加一个过滤功能:
$scope.exactFilter = function(value) {
return value.region_id === $scope.emriate;
};
然后将其用作过滤器。
真的,请检查 AngularJS 文档,一切都在那里;)
推荐阅读
- excel - 以文本为参考的 Excel 索引公式 no VBA no Add-on CLOSE file dynamic range
- java - <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Eclipse photon jdk 10 Tomcat 9
- r - 将 flextable、ggplot、文本和图像组合成一个网格对象,然后将其添加到 powerpoint 幻灯片
- python - Python grpcio 最佳编程实践
- excel - Python中Excel的Weeknum函数的等价物
- angular - Angular:过去 12 个月的补丁数量?
- javascript - How load a javascript from other javascript file
- c# - 从函数返回到 switch case
- angular - 当我使用 Angular5 切换到另一个组件时,如何保留已完成的数据。不使用本地存储
- file - 对于大文件,Internet Explorer FileReader 结果为空