如何使用AngularJS过滤数组,并使用过滤对象的属性作为ng-model属性?
如果我有一个对象数组,并且我想要将Angular模型绑定到基于filter的其中一个元素的属性,那么我该怎么做? 我可以用一个具体的例子来更好地解释:
HTML:
<!DOCTYPE html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> <meta charset=utf-8 /> <title>JS Bin</title> </head> <body ng-controller="MyCtrl"> <input ng-model="results.year"> <input ng-model="results.subjects.title | filter:{grade:'C'}"> </body> </html>
控制器:
function MyCtrl($scope) { $scope.results = { year:2013, subjects:[ {title:'English',grade:'A'}, {title:'Maths',grade:'A'}, {title:'Science',grade:'B'}, {title:'Geography',grade:'C'} ] }; }
JSBin: http : //jsbin.com/adisax/1/edit
我想过滤第二个input到“C”级的主题,但是我不想把模型绑定到等级上 ; 我想将它绑定到具有“C”级的主题的标题 。
这是可能的,如果是这样,它是如何做的?
<div ng-repeat="subject in results.subjects | filter:{grade:'C'}"> <input ng-model="subject.title" /> </div>
您可以使用控制器中的“filter”filter来获得所有的“C”等级。 获得结果数组的第一个元素将会给你带有等级“C”的主题的标题 。
$scope.gradeC = $filter('filter')($scope.results.subjects, {grade: 'C'})[0];
http://jsbin.com/ewitun/1/edit
与普通的ES6相同:
$scope.gradeC = $scope.results.subjects.filter((subject) => subject.grade === 'C')[0]
这是一个带有工作示例的修改的JSBin:
http://jsbin.com/sezamuja/1/edit
这是我在input中用filter做的事情:
<input ng-model="(results.subjects | filter:{grade:'C'})[0].title">
如果你想在控制器中创build一个单独的结果列表,你可以应用一个filter
function MyCtrl($scope, filterFilter) { $scope.results = { year:2013, subjects:[ {title:'English',grade:'A'}, {title:'Maths',grade:'A'}, {title:'Science',grade:'B'}, {title:'Geography',grade:'C'} ] }; //create a filtered array of results //with grade 'C' or subjects that have been failed $scope.failedSubjects = filterFilter($scope.results.subjects, {'grade':'C'}); }
然后,您可以按照引用结果对象的相同方式引用failedSubjects
你可以在这里阅读更多关于https://docs.angularjs.org/guide/filter
因为这个答案angular度已经更新了他们现在build议调用filter的文档
// update // eg: $filter('filter')(array, expression, comparator, anyPropertyKey); // becomes $scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'});
请注意,如果您使用$filter是这样的:
$scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'});
而你碰巧还有另外一个等级,哦,我不知道,CC或AC或C +或CCC把他们拉进去。 您需要附加完全匹配的要求:
$scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'}, true);
当我拿出一些这样的佣金细节时,这真的杀了我:
var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}))[0];
只会被调用一个错误,因为它提供了佣金ID 56而不是6。
添加真实的强制精确匹配。
var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}, true))[0];
然而,我更喜欢这个(我使用打字稿,因此“Let”和=>):
let obj = this.$filter('filter')(this.CommissionTypes, (item) =>{ return item.commission_type_id === 6; })[0];
我这样做是因为,在某个时候,我可能想从过滤的数据中获得更多的信息等等。
你也可以用$filter('filter')
来使用函数 :
var foo = $filter('filter')($scope.results.subjects, function (item) { return item.grade !== 'A'; });