我正在编写一个 angular.js 应用程序,我需要在 JSON 数组上执行 filter-orderBy 。 如果我通过创建一个不带参数并使用 $scope 引用显式数组的方法来做到这一点,则一切正常:
...
<th class="ui th" ng-click="sortArray('name')">Name</th>
...
sortArray = (sortParam) ->
$scope.myArray = $filter('orderBy')($scope.myArray, sortParam)
但是如果我尝试通过将数组作为方法参数来泛化它,如下所示:
...
<th class="ui th" ng-click="sortArray(myArray,'name')">Name</th>
...
sortArray = (arr,sortParam) ->
arr = $filter('orderBy')(arr, sortParam)
看起来数组在后端已排序,但使用它进行 ng-repeat 的表在视觉上保持不变。示例:我有这个数组:
{ arr :
[
{ 'id' : 1 },
{ 'id' : 2 },
{ 'id' : 3 }
]
}
现在,在第一种情况下,如果我按第一种情况排序,渲染将更改以匹配排序后的数组。但在第二种情况下,渲染不会改变(它仍然显示为 1 - 2 - 3),但如果我让它打印第一个单元格的 id(呈现“1”),它会显示“3”(排序后数组的顶部。希望它有意义。
我需要它的原因是打开一个包含单击的行内容的模式。为此,我在 ng-repeat 标记中放置了 ng-click,索引为:
<tr ng-repeat="row in arr | filter:filter" ng-click="loadModal($index)">
这样,即使数组重新排序,loadModal($index) 的值也不会改变,in 将以正确的行打开。
那么,在这么长的解释之后 - 我如何编写一个通用方法,它可以接受和排序不同的数组(代码重用),但也会影响渲染?或者,这是这样做的正确方法吗?我没有数组条目的 ID,也没有任何自然的东西可以用来识别该行。
最佳答案
我认为你不需要编写通用方法
!
在 View 中使用 orderBy
过滤器和 ng-repeat
,例如
<tr ng-repeat="friend in friends | orderBy:predicate:reverse">
并在ng-click
上设置谓词
值,例如
<th class="ui th" ng-click="predicate = 'name'; reverse= !reverse">Name</th>
当您点击Name
时,predicate
会将值传递给orderBy
过滤器,您的 View 会自动调整最新的更改,相反= !reverse
用于切换排序。
检查 angularjs Demo
关于javascript - 如何在 AngularJS 中编写通用排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21422916/