【发布时间】:2014-10-04 17:09:55
【问题描述】:
我在使用填充有 ng-repeat 选项值的下拉菜单时遇到问题,甚至在使用 ng-options 时也遇到了问题。
基本上,我是从数据库中提取子公司列表。然后,我有一个下拉列表来选择一家公司,而该公司又应使用所选公司的子公司填充子公司下拉列表。由于许多子公司属于同一家公司,如果我尝试在 ng-repeat 中提取公司名称,我会多次获得同一家公司。所以我创建了一个自定义过滤器,它只过滤掉列出的每家公司的 companyName 和 companyID 一次。
理论上,当我更改公司下拉列表的值时,会列出正确的子公司。但是,公司框中显示的值停留在列出的第一个选项上并且不会改变。如果我删除自定义过滤器并允许它列出所有重复名称,则该框将正确显示。
我的第一个想法是进行单独的 HTTP 调用,它只会从我的公司表中获取公司,但我想我想将 HTTP 调用限制为尽可能少。另外,我似乎应该能够做到这一点。
当我使用过滤器时,我没有掌握什么概念会阻止它正确显示,我应该怎么做才能解决这个问题? 谢谢
HTML:
<div class="col-sm-5">
<select ng-model ="parentCompany" name="company">
<option ng-repeat="company in companies | uniqueCompanies:'companyName'" value="{{company.id}}" >{{company.name}}</option>
</select>
</div>
<div class="col-sm-5">
<select name="subsidiary">
<option ng-repeat="subsidary in companies" value="{{subsidary.subID}}" ng-hide="$parent.parentCompany !== subsidary.companyID">{{subsidary.subName}}</option>
</select>
</div>
控制器:
getCompanies();
function getCompanies(){
$http.get("get.php?table=getcompanies").success(function(data) {
$scope.companies = data;
});
}
过滤器:
.filter("uniqueCompanies", function() {
return function(data, propertyName) {
if (angular.isArray(data) && angular.isString(propertyName)) {
var results = [];
var keys = {};
for (var i = 0; i < data.length; i++) {
var val = data[i][propertyName];
var val2 = data[i]['companyID'];
if (angular.isUndefined(keys[val])) {
keys[val] = true;
results.push({'name':val, 'id':val2});
}
}
return results;
} else {
return data;
}
};
});
样本数据:
[{"subID":null,"subName":null,"companyID":"1","companyName":"DWG"},
{"subID":null,"subName":null,"companyID":"2","companyName":"Vista"},
{"subID":"1008","subName":"Data Services","companyID":"3","companyName":"Medcare"},
{"subID":"1009","subName":"Companion","companyID":"3","companyName":"Medcare"},
{"subID":"1010","subName":"GBA","companyID":"3","companyName":"Medcare"},
{"subID":"1011","subName":"PGBA","companyID":"3","companyName":"Medcare"},
{"subID":"1013","subName":"Health Plan","companyID":"3","companyName":"Medcare"},
{"subID":"1014","subName":"PAISC","companyID":"3","companyName":"Medcare"},
{"subID":"1015","subName":"CGS","companyID":"3","companyName":"Medcare"}]
【问题讨论】:
-
在选择之前在控制器中运行过滤器会有帮助吗?
-
因为过滤器每次都返回一个新对象数组,所以您需要提供一个
track by表达式。看看这是否有所作为。 -
你能给一些示例数据吗?这有点难以理解,因为您在过滤器中重命名了属性。看起来您的数据包含
companyName、companyID、subID和subName。如果子公司拥有自己的子公司,规则是什么?即“GE->NBC Universal->NBC 广播”? -
@Dylan - 我之前没有在控制器中使用过过滤器。但是根据您的建议,我只是尝试将 $filter 添加到我的控制器,然后通过
$scope.oldCo = $filter('uniqueCompanies')($scope.companies, 'companyName')过滤但是 $scope.oldCo 是空的。我做错了吗? -
@AndyMcCormick 喜欢这样的作品 - jsfiddle.net/devitate/zfx6sbdf
标签: angularjs angularjs-ng-repeat angularjs-filter