angular度反转 – 重复
我怎样才能得到一个反向阵列的angular度? 我试图使用orderByfilter,但它需要一个谓词(如“名称”)来sorting:
<tr ng-repeat="friend in friends | orderBy:'name':true"> <td>{{friend.name}}</td> <td>{{friend.phone}}</td> <td>{{friend.age}}</td> <tr>
有没有一种方法来反转原始数组,没有sorting。 像那样:
<tr ng-repeat="friend in friends | orderBy:'':true"> <td>{{friend.name}}</td> <td>{{friend.phone}}</td> <td>{{friend.age}}</td> <tr>
我会build议使用这样的自定义filter:
app.filter('reverse', function() { return function(items) { return items.slice().reverse(); }; });
然后可以使用,如:
<div ng-repeat="friend in friends | reverse">{{friend.name}}</div>
看到它在这里工作: Plunker示范
这个filter可以被定制以适应您的需要。 我在示范中提供了其他例子。 一些选项包括在执行反转之前检查variables是否是一个数组,或者使它更容易反转更多的东西,如string。
这是我用的:
<alert ng-repeat="alert in alerts.slice().reverse()" type="alert.type" close="alerts.splice(index, 1)">{{$index + 1}}: {{alert.msg}}</alert>
更新:
我的回答是可以的老版本的Angular。 现在,你应该使用
ng-repeat="friend in friends | orderBy:'-'"
要么
ng-repeat="friend in friends | orderBy:'+':true"
对不起,在一年后提出这个问题,但有一个新的, 更简单的解决scheme , 适用于Angular v1.3.0-rc.5及更高版本 。
在文档中提到:“如果没有提供属性(例如'+'),那么数组元素本身用于比较sorting”。 所以,解决scheme将是:
ng-repeat="friend in friends | orderBy:'-'"
或者
ng-repeat="friend in friends | orderBy:'+':true"
这个解决scheme似乎更好,因为它不修改数组,并且不需要额外的计算资源 (至less在我们的代码中)。 我读过所有现有的答案,仍然喜欢这一个给他们。
您可以通过$ index参数进行反转
<tr ng-repeat="friend in friends | orderBy:'$index':true">
简单的解决scheme: – (不需要做任何方法)
ng-repeat = "friend in friends | orderBy: reverse:true"
你可以在你的示波器上调用一个方法来为你反转,就像这样:
<!doctype html> <html ng-app="myApp"> <head> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script src="http://code.angularjs.org/1.0.5/angular.min.js"></script> <script> angular.module('myApp', []).controller('Ctrl', function($scope) { $scope.items = [1, 2, 3, 4]; $scope.reverse = function(array) { var copy = [].concat(array); return copy.reverse(); } }); </script> </head> <body ng-controller="Ctrl"> <ul> <li ng-repeat="item in items">{{item}}</li> </ul> <ul> <li ng-repeat="item in reverse(items)">{{item}}</li> </ul> </body> </html>
请注意, $scope.reverse
会创build一个数组的副本,因为Array.prototype.reverse
会修改原始数组。
如果您正在使用1.3.x,则可以使用以下内容
{{ orderBy_expression | orderBy : expression : reverse}}
示例按发布date按降序列出书籍
<div ng-repeat="book in books|orderBy:'publishedDate':true">
来源: https : //docs.angularjs.org/api/ng/filter/orderBy
如果您使用的是angularjs 版本1.4.4及以上版本 ,一个简单的sorting方法是使用“ $ index ”。
<ul> <li ng-repeat="friend in friends|orderBy:$index:true">{{friend.name}}</li> </ul>
查看演示
当在.NET中使用MVC的MVC时,你可以总是使用OrderByDecending()做这样的数据库查询:
var reversedList = dbContext.GetAll().OrderByDecending(x => x.Id).ToList();
然后在Angular方面,它已经在一些浏览器(IE)中被颠倒了。 在支持Chrome和FF时,您需要添加orderBy:
<tr ng-repeat="item in items | orderBy:'-Id'">
在此示例中,您将按照.Id属性的降序进行sorting。 如果您正在使用分页,这会变得更加复杂,因为只有第一页将被sorting。 您需要通过控制器的.jsfilter文件来处理,或者以其他方式处理。
你也可以使用.reverse()。 这是一个本地数组函数
<div ng-repeat="friend in friends.reverse()">{{friend.name}}</div>
那是因为你正在使用JSON对象。 当你遇到这样的问题,然后将您的JSON对象更改为JSON数组对象。
例如,
{"India":"IN","America":"US","United Kingdon":"UK"} json object [{"country":"India","countryId":"IN"},{"country":"America","countryId":"US"},{"country":"United Kingdon","countryId":"UK"}]
orderBy
filter在Angular 1.4.5中执行稳定的sorting 。 (请参阅GitHub拉取请求https://github.com/angular/angular.js/pull/12408 。)
所以使用常量谓词和reverse
设置为true
就足够了:
<div ng-repeat="friend in friends | orderBy:0:true">{{friend.name}}</div>
我发现这样的东西,而不是我使用对象的数组。
这是我的对象解决scheme:
添加自定义filter
app.filter('orderObjectBy', function() { return function(items, field, reverse){ var strRef = function (object, reference) { function arr_deref(o, ref, i) { return !ref ? o : (o[ref.slice(0, i ? -1 : ref.length)]); } function dot_deref(o, ref) { return !ref ? o : ref.split('[').reduce(arr_deref, o); } return reference.split('.').reduce(dot_deref, object); }; var filtered = []; angular.forEach(items, function(item) { filtered.push(item); }); filtered.sort(function (a, b) { return (strRef(a, field) > strRef(a, field) ? 1 : -1); }); if(reverse) filtered.reverse(); return filtered; }; });
然后可以使用像
<div ng-repeat="(key, value) in items | orderObjectBy:'field.any.deep':true">
如果您需要旧的浏览器支持,则需要定义reducefunction(仅在ECMA-262 mozilla.org中提供 )
// Production steps of ECMA-262, Edition 5, 15.4.4.21 // Reference: http://es5.github.io/#x15.4.4.21 if (!Array.prototype.reduce) { Array.prototype.reduce = function(callback /*, initialValue*/) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.reduce called on null or undefined'); } if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length == 2) { value = arguments[1]; } else { while (k < len && !(k in t)) { k++; } if (k >= len) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k++]; } for (; k < len; k++) { if (k in t) { value = callback(value, t[k], k, t); } } return value; }; }
我自己已经对这个问题感到沮丧,所以我修改了由@Trevor Senior创build的filter,因为我遇到了一个问题,我的控制台说它不能使用反向方法。 我也想保持对象的完整性,因为这是Angular最初在ng-repeat指令中使用的。 在这种情况下,我用愚蠢(键)的input,因为控制台会不高兴,说有重复的,在我的情况下,我需要跟踪$索引。
过滤:
angular.module('main').filter('reverse', function() { return function(stupid, items) { var itemss = items.files; itemss = itemss.reverse(); return items.files = itemss; }; });
HTML: <div ng-repeat="items in items track by $index | reverse: items">
我添加一个答案,没有人提到。 我会尽量让服务器做到这一点,如果你有。 如果服务器返回大量logging,则客户端过滤可能很危险。 因为你可能会被迫添加分页。 如果你有从服务器分页,然后客户端过滤按顺序,将在当前页面。 这会混淆最终用户。 所以,如果你有一个服务器,然后发送orderby与呼叫,让服务器返回它。
我会使用数组本机反向方法总是更好的select创buildfilter或使用$index
。
<div ng-repeat="friend in friends.reverse()">{{friend.name}}</div>
Plnkr_demo 。