如何在不更改数组元素位置的情况下反转,应该只使用管道更新视图
我可以使用array.reverse()
,但是将第一项放在最后,依此类推,以便元素索引更改
import { Component } from '@angular/core';
export interface Order {
value: string;
viewValue: string;
}
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'orderBy'
})
export class OrderByPipe implements PipeTransform {
transform(value: any[], arg: string): any {
console.log('value', value);
console.log('args', arg);
if (arg === 'desc') {
return value.reverse();
}
if (arg === 'asc') {
return value;
}
}
}
/**
* @title Basic select
*/
@Component({
selector: 'select-overview-example',
template: `<h4>Basic mat-select</h4>
<mat-form-field>
<mat-label>Sort Order</mat-label>
<mat-select value='asc'>
<mat-option *ngFor="let order of orders" (click)="changeOrder(order.value)" [value]="order.value">
{{order.viewValue}}
</mat-option>
</mat-select>
</mat-form-field>
<ul>
<li *ngFor="let item of items| orderBy : sort; index as i">{{i}} -> {{item}}</li>
</ul>`,
styleUrls: ['select-overview-example.css'],
})
export class SelectOverviewExample {
orders: Order[] = [
{ value: 'asc', viewValue: 'Ascending' },
{ value: 'desc', viewValue: 'Descending' }
];
items: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
sort: string = 'asc';
changeOrder(val: string) {
console.log('val', val);
this.sort = val;
}
}
答案 0 :(得分:0)
您可以使用let clone = myArray.slice();
克隆阵列。重新排序克隆不会影响原始阵列。看起来像that's what Material's table does。
答案 1 :(得分:0)
我们的主要问题是只能以相反的顺序更改视图。因此无需更新逻辑。仅更新CSS。
如果使用flex-box CSS显示项目,那么我们可以使用flex-direction
属性将其反转。
flex-direction : row;
flex-direction: column;
flex-direction: row-reverse;
flex-direction: column-reverse;
,并且如果使用UL和LI显示项目,则在css下面应用反向订单。 如下所示:
ul {
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
}
ul > li {
-moz-transform: rotate(-180deg);
-webkit-transform: rotate(-180deg);
transform: rotate(-180deg);
}
答案 2 :(得分:-1)
您可以创建用于对asc或desc进行排序并对数组进行排序的自定义管道
##TEMPLATE##
<div *ngFor="let order of Orders | orderBy:'asc'">
##PIPE##
export class OrderByPipe implements PipeTransform {
transform(orders: any[], field: string): any[] {
orders.sort((a: any, b: any) => {
if (a[field] < b[field]) {
return -1;
} else if (a[field] > b[field]) {
return 1;
} else {
return 0;
}
});
}
}