【发布时间】:2020-12-15 11:17:23
【问题描述】:
我正在尝试使我的表格列可排序。我在这里找到了这个教程:https://www.youtube.com/watch?v=UzRuerCoZ1E&t=715s
使用这些信息,我得到了以下结果:
处理排序的管道
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'sort',
pure: true
})
export class TableSortPipe implements PipeTransform {
transform(list: any[], column:string): any[] {
let sortedArray = list.sort((a,b)=>{
if(a[column] > b[column]){
return 1;
}
if(a[column] < b[column]){
return -1;
}
return 0;
})
return sortedArray;
}
}
这是帮助我构建表格的组件。这里我定义了 sortedColumn 变量。
import { NavbarService } from './../navbar/navbar.service';
import { LiveUpdatesService } from './live-updates.service';
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
@Component({
selector: 'app-live-updates',
templateUrl: './live-updates.component.html',
styleUrls: ['./sass/live-updates.component.scss']
})
export class LiveUpdatesComponent implements OnInit{
stocks$: Observable<any[]>;
sortedColumn: string;
constructor(private updatesService: LiveUpdatesService, public nav: NavbarService) {
this.stocks$ = this.updatesService.getStocks();
}
ngOnInit() {
this.nav.show();
}
}
这是我的模板文件。如您所见,我已将sort 管道连接到我的循环,吐出表格行。值得注意的是,我渲染表格的方式与视频不同。例如,他的数据存储在数组中,但我的数据存储在 Firebase 上。他正在动态渲染他的表格,但我的表格固定在一定数量的列上。我也在对标题进行硬编码,但他使用数组中的变量名来生成表标题。我不确定这些差异是否会妨碍工作。
<section class="score-cards">
<app-score-cards></app-score-cards>
</section>
<section class="live-updates-wrapper">
<div class="table-wrapper">
<table class="stock-updates">
<thead>
<tr>
<th class="ticker-fixed">Ticker</th>
<th><a (click)="sortedColumn = $any($event.target).textContent">Ask Price</a></th>
<th><a (click)="sortedColumn = $any($event.target).textContent">Tax Value</a></th>
<th><a (click)="sortedColumn = $any($event.target).textContent">Est. Value</a></th>
<th><a (click)="sortedColumn = $any($event.target).textContent">Location</a></th>
</tr>
</thead>
<tbody>
<tr *ngFor="let s of stocks$ | async | sort : sortedColumn">
<td class="ticker-fixed">
<a target="_blank" href="https://robinhood.com/stocks/{{ s.TICKER }}">{{ s.TICKER }}</a>
<span class="sp500">{{ s.sp500_flag }}S&P</span>
</td>
<td>{{ s.CLOSE }}</td>
<td>{{ s.tax_diff }}</td>
<td>{{ s.MarketCap }}</td>
<td>{{ s.Sector }}</td>
</tr>
</tbody>
</table>
</div>
</section>
我收到以下错误,但能够通过在我的管道文件中注入以下代码来修复它:list = !!list ? list : [];
现在没有错误,但排序没有按预期工作。当我单击表头时,什么也没有发生。我该如何解决这个问题?
【问题讨论】:
-
什么模块提供了您的 SortPipe?
-
@Z。 Bagley 我不知道我正在使用一个。本教程没有涵盖这一点。我为我缺乏知识而道歉。我只知道一点 Angular。
-
这个涵盖了它:stackoverflow.com/questions/40457744/… 总体思路:您需要在您的
declarations中声明管道,然后您还需要在您的providers中提供您的管道。如果你唯一的模块是 AppModule,你可以在那里做这两件事。 -
@Z.Bagley 啊,是的!我使用了 ng g pipe 命令,因此所有内容都自动添加到了我的 app.module.ts 文件中。它已添加到声明中,但未添加到提供程序中。供应商有必要吗?我已经成功实现了其他尚未添加到提供程序的管道。
-
提供者中不应该要求它,您没有在组件中使用它。我想我看到了实际问题。在管道中的第一行之前添加:
list = !!list ? list : [];问题是您在某个时候传入了undefined,它正在尝试将.sort(..)应用于undefined。list = !!list ? list : []将在未定义的任何时候应用一个空数组来赋值!
标签: angular typescript