对嵌套 ng-repeat (AngularJS) 中的列进行排序
Sorting columns in nested ng-repeat (AngularJS)
目前我无法使用 orderBy
-过滤器对列表的列进行排序。我遇到的问题是嵌套的 ngRepeat。
查看:
<md-list>
<md-list-item>
<span ng-repeat="item in ::hItems track by $index" ng-click="sortBy(item)" flex>
{{ ::item }}
</span>
</md-list-item>
<md-divider></md-divider>
<md-list-item ng-repeat="cItem in ::cItems | orderBy:sortType:sortReverse track by $index">
<span ng-repeat="(key, value) in ::cItem track by $index" flex>
{{ ::value }}
</span>
<md-divider></md-divider>
</md-list-item>
</md-list>
只要用户单击列 header,函数 sortBy
就会被调用。该功能在controller中实现如下:
//Default values:
$scope.sortType = 'NAME';
$scope.sortReverse = false;
var orderBy = $filter('orderBy');
//sortBy func:
function sortBy(columnKey) {
$scope.sortType = columnKey;
$scope.sortReverse = !$scope.sortReverse;
$scope.cItems = orderBy($scope.cItems, $scope.sortType, $scope.sortReverse);
}
列表仅按默认值 name
排序。这是 GET-request 的数组输出:
//JSON data
[
{
"ArtNo": "DE123",
"SHORTCODE": "ABC",
"NAME": "article one",
"QUANTITY": 3,
"GROUPID": 1,
"ACTIVE": 1
},...
]
所以,我需要嵌套的 ngRepeat,因为您如何查看数组是用键号和 object 值 => [0:Object, 1:Object...]
定义的。我的 sortBy
-函数只需要一个解决方案。有人有想法吗?
以下是我的输出列表:
ArtNo | SHORTCODE | NAME | QUANTITY
DE123 | ABC001 | article one | 3
DE456 | ABC002 | article two | 8
DE789 | ABC003 | article three | 4
DE321 | ABC004 | article four | 13
....
如果我没理解错的话,你想要这样的行为:
- 用户点击想要排序的列,table内容将按该列排序。
- 用户再次点击,排序方向反转。
对吗?
那你为什么要订购两倍的阵列?
//Default values:
$scope.sortType = 'NAME';
$scope.sortReverse = false;
var orderBy = $filter('orderBy');
//sortBy func:
function sortBy(columnKey) {
$scope.sortType = columnKey;
$scope.sortReverse = !$scope.sortReverse;
// You do not need to order anything here. Just define your orderby parameters here to be used on view.
}
实解
通过与问题作者的交谈,我们确实发现了这里的主要问题:
在 ng-repeat
上使用 ::
语法避免了 angular 观察 OrderBy
过滤器上的变化,因此变化没有反映在视图上。
目前我无法使用 orderBy
-过滤器对列表的列进行排序。我遇到的问题是嵌套的 ngRepeat。
查看:
<md-list>
<md-list-item>
<span ng-repeat="item in ::hItems track by $index" ng-click="sortBy(item)" flex>
{{ ::item }}
</span>
</md-list-item>
<md-divider></md-divider>
<md-list-item ng-repeat="cItem in ::cItems | orderBy:sortType:sortReverse track by $index">
<span ng-repeat="(key, value) in ::cItem track by $index" flex>
{{ ::value }}
</span>
<md-divider></md-divider>
</md-list-item>
</md-list>
只要用户单击列 header,函数 sortBy
就会被调用。该功能在controller中实现如下:
//Default values:
$scope.sortType = 'NAME';
$scope.sortReverse = false;
var orderBy = $filter('orderBy');
//sortBy func:
function sortBy(columnKey) {
$scope.sortType = columnKey;
$scope.sortReverse = !$scope.sortReverse;
$scope.cItems = orderBy($scope.cItems, $scope.sortType, $scope.sortReverse);
}
列表仅按默认值 name
排序。这是 GET-request 的数组输出:
//JSON data
[
{
"ArtNo": "DE123",
"SHORTCODE": "ABC",
"NAME": "article one",
"QUANTITY": 3,
"GROUPID": 1,
"ACTIVE": 1
},...
]
所以,我需要嵌套的 ngRepeat,因为您如何查看数组是用键号和 object 值 => [0:Object, 1:Object...]
定义的。我的 sortBy
-函数只需要一个解决方案。有人有想法吗?
以下是我的输出列表:
ArtNo | SHORTCODE | NAME | QUANTITY
DE123 | ABC001 | article one | 3
DE456 | ABC002 | article two | 8
DE789 | ABC003 | article three | 4
DE321 | ABC004 | article four | 13
....
如果我没理解错的话,你想要这样的行为:
- 用户点击想要排序的列,table内容将按该列排序。
- 用户再次点击,排序方向反转。
对吗?
那你为什么要订购两倍的阵列?
//Default values:
$scope.sortType = 'NAME';
$scope.sortReverse = false;
var orderBy = $filter('orderBy');
//sortBy func:
function sortBy(columnKey) {
$scope.sortType = columnKey;
$scope.sortReverse = !$scope.sortReverse;
// You do not need to order anything here. Just define your orderby parameters here to be used on view.
}
实解
通过与问题作者的交谈,我们确实发现了这里的主要问题:
在 ng-repeat
上使用 ::
语法避免了 angular 观察 OrderBy
过滤器上的变化,因此变化没有反映在视图上。