我在选择元素上使用自定义排序过滤器和ng-options时遇到问题。问题是它没有对我的数值进行排序。
您可以在下面的plnkr中看到问题,它应该对'id'值进行排序,但select元素中的排序非常奇怪。
http://plnkr.co/edit/Z99aEFLuWUFWuyc8GM9t?p=preview
var app = angular.module('testApp', []);
app.filter('sortKeyIds', function() {
return function(input) {
//Copy original list
var keys = input.concat([]);
keys.sort(function(a, b) {
return a.id - b.id;
});
return keys;
}
});
app.controller('MainController', function($scope) {
$scope.controllerName = "MainController";
$scope.months = [
{"id":15,"val":"15x250"},
{"id":88,"val":"88x31"},
{"id":120,"val":"120x90"},
{"id":125,"val":"125x125"},
{"id":160,"val":"160x600"},
{"id":180,"val":"180x150"},
{"id":234,"val":"234x60"},
{"id":240,"val":"240x400"},
{"id":250,"val":"250x250"},
{"id":300,"val":"300x100"},
{"id":336,"val":"336x280"},
{"id":468,"val":"468x60"},
{"id":720,"val":"720x300"},
{"id":728,"val":"728x90"},
{"id":980,"val":"980x300"},
{"id":1250,"val":"1250x250"}
];
});
<!-- begin snippet: js hide: false console: true babel: false -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>AngularCameraApp</title>
<link rel="stylesheet" href="style.css" />
<script src="https://code.angularjs.org/1.3.15/angular.js"></script>
</head>
<body ng-app="testApp" ng-controller="MainController">
<h3>Weird sorting</h3>
<select ng-model="avtripExpMonth" ng-options="value.lang as value.val for (key, value) in months | sortKeyIds"></select>
</body>
</html>
答案 0 :(得分:1)
var app = angular.module('testApp', []);
/* You could remove this part.
app.filter('sortKeyIds', function() {
return function(input) {
//Copy original list
var keys = input.concat([]);
console.log(keys);
keys.sort(function(a, b) {
return a.id - b.id;
});
return keys;
}
});*/
app.controller('MainController', function($scope) {
$scope.controllerName = "MainController";
$scope.months = [
{"id":15,"val":"15x250"},
{"id":88,"val":"88x31"},
{"id":120,"val":"120x90"},
{"id":125,"val":"125x125"},
{"id":160,"val":"160x600"},
{"id":180,"val":"180x150"},
{"id":234,"val":"234x60"},
{"id":240,"val":"240x400"},
{"id":250,"val":"250x250"},
{"id":300,"val":"300x100"},
{"id":336,"val":"336x280"},
{"id":468,"val":"468x60"},
{"id":720,"val":"720x300"},
{"id":728,"val":"728x90"},
{"id":980,"val":"980x300"},
{"id":1250,"val":"1250x250"}
];
});
&#13;
/* Styles go here */
.one {
font-size:2em;
}
.two {
color:red;
}
.aclass {
text-align:center;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>AngularCameraApp</title>
<script data-require="jquery@*" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="https://code.angularjs.org/1.3.15/angular.js"></script>
<script src="https://code.angularjs.org/1.3.15/angular-route.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="testApp" ng-controller="MainController">
<h3>Weird sorting</h3>
<select ng-model="avtripExpMonth" ng-options="month.val for month in months track by month.id | orderBy:month.id"></select>
<ul id="preview"></ul>
</body>
</html>
&#13;
你可以使用Angular的orderBy过滤器。不确定为什么要使用自定义过滤器来完成一项简单的任务。
this fiddle 为您效劳。我真的不了解你的(key, value)
。我就是这样做的。
答案 1 :(得分:0)
这并不奇怪。您没有使用正确的语法。 Angular破坏了那个过滤器。
您在ng-options上不需要(key, value)
。并且过滤器语法是正确的。
以下是更新后的Plunker
<select ng-model="avtripExpMonth" ng-options="value.lang as value.val for value in months | sortKeyIds"></select>
我刚刚将其更改为value
,一切正常。
希望有所帮助