AngularJS命令精炼

时间:2016-06-16 16:09:04

标签: angularjs angularjs-filter angularjs-orderby

我有一个以标题开头的名字表(先生,夫人等)以及以字符串形式存储的日期以及其他一些数据。

我目前正在使用

对其进行排序
<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

2 个答案:

答案 0 :(得分:1)

以正确的格式获取正确的数据

标题&amp;名称

我使用正则表达式从名称中提取标题:

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 属性。然后我可以基于此排序。我没有在示例中对日期进行此操作,但您可以进行推断和应用。

ng-init w。 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做了。你可以弄清楚我在做什么。

笔 - http://codepen.io/jusopi/pen/aZZjgG?editors=1010

答案 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