我有一个以标题开头的名字表(先生,夫人等)以及以字符串形式存储的日期以及其他一些数据。
我目前正在使用
对其进行排序<tr dir-paginate="booking in bookingResults | orderBy:sortType:sortReverse | filter:searchPassenger | itemsPerPage: 15">
我怎样才能优化我的订单以排除名称(先生,夫人等)以及日期作为解析日期而不是字符串的名称。
这里最好的做法是什么?
编辑: 我不想在模型中更改模型中的名称 - 我希望格式保留&#34; Foo先生&#34;和&#34; Bar先生&#34;但是当我对它们进行排序时,我希望它们就好像它们只是“Foo&#34;和&#34; Bar&#34;。
编辑编辑: AngularJS 1.5.6
答案 0 :(得分:1)
我使用正则表达式从名称中提取标题:
var regex = /((Dr\.|Mr\.|Ms\.|Miss|Mrs\.)\s*)/gmi
objName.replace(regex, '')
我假设您正在获取日期对象或标准日期字符串。如果是后者,只需通过new Date(incomingDateString)
创建一个Date对象。然后你可以打电话:
objDate.getTime() //returns epoch in milliseconds
有些人可能不喜欢这个,但我讨厌使用NG指令需要用于排序等方法的方法弄脏视图控制器。相反,我在每个行项目上使用ng-init
添加了一些 ng-flagged 属性。然后我可以基于此排序。我没有在示例中对日期进行此操作,但您可以进行推断和应用。
<tr ng-repeat="row in vc.listData | orderBy:vc.sortKey track by $index"
ng-init="row.$name = row.name.replace(vc.regexp, '')">
换句话说,你的对象就是这样的:
{
name:'Mr. Fred Rogers',
date:<date-object>
}
感谢ng-init
:
{
name:'Mr. Fred Rogers',
date:<date-object>,
$name:'Fred Rogers',
$date:1466192224091
}
然后通过排序用户界面,您可以将$scope.sortKey
设置为$name
或$date
。
我在代码笔中制作了一个样本,但我用我的模板coffeescript和jade做了。你可以弄清楚我在做什么。
答案 1 :(得分:0)
好的,经过一些研究,我发现最简单的解决方案是升级到 AngularJS 1.5.7版,将comparator引入orderBy过滤器。
所以我改变了我的中继器以使用比较器的命令
<tr dir-paginate="booking in Results | orderBy:Variable:TrueOrFalse:bookingComparator">
变量 是一个字符串,我绑定到表格标题,以便您可以按键更改顺序, TrueOrFalse 是一个如果单击表格标题并且 bookingComparator 是我的实际比较器,则布尔值在升序和降序之间交替。
我的预订比较器看起来像这样
$scope.bookingComparator = function (a, b) {
var getTitle = /((Mrs|Mr|Mstr|Miss|Dr)\s*)/g;
var isDate = /(-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-)/g
if (getTitle.test(a.value)) {
var aName = a.value, bName = b.value;
return aName.replace(getTitle, '') < bName.replace(getTitle, '') ? -1 : 1
}
if (isDate.test(a.value)) {
var aDate = new Date(a.value), bDate = new Date(b.value);
return aDate.getTime() < bDate.getTime() ? -1 : 1
}
return a.index < b.index ? -1 : 1
}
比较器基本上是一个像javascript .sort()方法一样的函数。
如果该值包含标题(Mr,Mrs等),则它是一个名称,因此我会删除标题并比较实际名称而不管标题。
如果变量与-Month-模式匹配,则它是一个日期字符串,我比较解析的日期对象。
希望这对某人有帮助,我花了一段时间才弄明白。如果您认为有更好的方法,我可以接受建议,并随时为想要使用AngularJS =&lt;的人发布答案。 1.5.6