【发布时间】:2014-01-30 19:30:55
【问题描述】:
我正在尝试使用自定义 orderBy 函数。最初,我希望数据按照添加到$scope.rows 的顺序显示,并且只有在单击列标题后才应按特定属性排序。这是我的小提琴:
这是我的观点:
<table ng-app ng-controller="ctrl">
<tr>
<th><a ng-click="orderBy = 'id'">ID</a></th>
<th><a ng-click="orderBy = 'name'">Name</a></th>
</tr>
<tr ng-repeat="row in rows | orderBy:mySort">
<td>{{row.object.id}}</td>
<td>{{row.object.name}}</td>
</tr>
</table>
这是我的控制器:
function ctrl($scope)
{
// Initially, we don't sort by anything
$scope.orderBy = "";
$scope.rows = [];
// Add some rows
for(var i = 10;i < 30;i++)
{
$scope.rows.push({settings: {foo: true}, object: {id: i, name: "Name " + i}})
};
$scope.mySort = function(row)
{
if($scope.orderBy != "")
{
return row.object[$scope.orderBy];
}
// What do I return here??
return "";
}
}
如果$scope.orderBy 没有设置,我想按原来的顺序返回$scope.rows,我在$scope.mySort 中返回什么?我不能return row.object.id,因为不能保证按 ID 顺序添加行。在 Chrome 32 上按原样运行我的代码,出现的第一行的 ID 为 20,即中间行。
【问题讨论】:
-
只是猜测:
return row.object.id? -
问题是,在我的真实应用程序中,不能保证按 ID 的顺序添加行。事实上,它们可能(看起来)在第一次加载时完全未排序,这是期望的。我更新了我的问题以反映这一点。
-
那么您最好的选择可能是为每个对象添加一个新属性 - 该属性应该表示可用于此排序的不断增长的索引。
-
不幸的是,我无法向我的对象添加属性,因为它已绑定到 socketIO 和 Redis。对象本身不知道它在一个行对象中这一事实。这就是为什么我希望在使用自定义 orderBy 函数时有一种方法可以保持行的自然顺序。
标签: javascript angularjs angularjs-ng-repeat angularjs-orderby