Angular Material table 可扩展 table 行未扩展?
Angular Material table expandable table row not expanding?
我盯着这个看的太久了,想不通。
在这个 Whosebug 中有一个很好的 Angular Material table 示例,其中包含一个可扩展的行。我可以将该示例插入到我的应用程序中,它可以正常工作。
我未能将示例应用到我的数据中。我认为我的问题出在 HTML,因为 table 呈现,扩展行 CSS 似乎得到应用(单击第一行时行描述消失),但扩展行没有出现。
有人看到问题了吗?提前致谢。
这是我所拥有的 StackBlitz。我已经将链接 SO 中的工作示例与我的损坏示例
并排放置
./tweets-table/tweets-table.component.ts:
import { Component, OnInit } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Tweet } from '../tweet';
import { TweetService } from '../tweet.service';
import { TweetsDataSource } from '../tweets.datasource';
import { data } from '../mock-tweets';
@Component({
selector: 'app-tweets-table',
templateUrl: './tweets-table.component.html',
styleUrls: ['./tweets-table.component.css'],
animations: [
trigger('detailExpand', [
state('collapsed', style({ height: '0px', minHeight: '0', visibility: 'hidden' })),
state('expanded', style({ height: '*', visibility: 'visible' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
})
export class TweetsTableComponent implements OnInit {
// Data
displayedColumns = [
'createdTime', 'tweetText', 'favoriteCount'
];
tweets: Tweet[];
expandedTweet: any;
dataSource: TweetsDataSource|null;
constructor(private tweetService: TweetService) {
}
ngOnInit() {
this.getTweets();
}
getTweets(): void {
// this.tweets = this.tweetService.getTweets(this.pageIndex, this.pageSize);
this.tweets = data;
this.dataSource = new TweetsDataSource(this.tweets);
}
isExpansionDetailRow = (i: number, row: Object) => {
row.hasOwnProperty('detailRow');
}
}
./tweets-table/tweets-table.component.html:
<div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource">
<!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" -->
<!-- Time Column -->
<ng-container matColumnDef="createdTime">
<mat-header-cell *matHeaderCellDef> Tweet Time </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.created_time}} </mat-cell>
</ng-container>
<!-- Text Column -->
<ng-container matColumnDef="tweetText">
<mat-header-cell *matHeaderCellDef> So Texty </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.text}} </mat-cell>
</ng-container>
<!-- Favs Column -->
<ng-container matColumnDef="favoriteCount">
<mat-header-cell *matHeaderCellDef> Flava Favs </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.favorite_count}} </mat-cell>
</ng-container>
<!-- Expanded Content Column - The detail row is made up of this one column -->
<ng-container matColumnDef="expandedDetail">
<mat-cell *matCellDef="let detail">
Walk before you run. Here's more text: {{detail.tweet.text}}
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"
matRipple
class="element-row"
[class.expanded]="expandedTweet == row"
(click)="expandedTweet = row"></mat-row>
<mat-row *matRowDef="let row; columns: ['expandedDetail']; when: isExpansionDetailRow"
[@detailExpand]="row.element == expandedTweet ? 'expanded' : 'collapsed'"
style="overflow: hidden">
</mat-row>
</mat-table>
</div>
我认为我的 DataSource 对象没问题。但是,我很难完全理解 MatDataSource,所以我也将其包括在内。
./tweets.datasource.ts:
import { Component, OnInit } from '@angular/core';
import { DataSource } from '@angular/cdk/collections';
import { Observable, of } from 'rxjs';
import { Tweet } from './tweet';
import { TweetService } from './tweet.service';
export class TweetsDataSource extends DataSource<Tweet> {
constructor(private tweets: Tweet[]) {
super();
}
connect(): Observable<Tweet[]> {
const rows = [];
this.tweets.forEach(element => rows.push(element, { detailRow: true, element }));
console.log('dataset rows:')
console.log(rows);
return of(this.tweets);
}
disconnect() { }
}
tweets.datasource.ts
在连接方法中,您return输入了错误的内容。它应该 return rows 而不是 this.tweets.
connect(): Observable<Tweet[]> {
const rows = [];
this.tweets.forEach(tweet => rows.push(tweet, { detailRow: true, tweet }));
console.log('dataset rows:')
console.log(rows);
return of(rows);
}
推文-table.component.ts
这也有一个错误,方法 isExpansionDetailRow 应该 return 一个布尔值 true 或 false(不是什么都不做)。所以添加 return。原始代码不需要 return 因为它只使用一行没有括号。
如果箭头函数只是 return 单行代码,您可以省略语句括号和 return 关键字。这告诉箭头函数 return 语句。参考 => https://codeburst.io/javascript-understand-arrow-function-syntax-ab4081bba85b
isExpansionDetailRow = (i: number, row: Object) => {
return row.hasOwnProperty('detailRow');
}
如果您对另一种方式感兴趣,可以参考这个问题。
我盯着这个看的太久了,想不通。
在这个 Whosebug
我未能将示例应用到我的数据中。我认为我的问题出在 HTML,因为 table 呈现,扩展行 CSS 似乎得到应用(单击第一行时行描述消失),但扩展行没有出现。
有人看到问题了吗?提前致谢。
这是我所拥有的 StackBlitz。我已经将链接 SO
./tweets-table/tweets-table.component.ts:
import { Component, OnInit } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { Tweet } from '../tweet';
import { TweetService } from '../tweet.service';
import { TweetsDataSource } from '../tweets.datasource';
import { data } from '../mock-tweets';
@Component({
selector: 'app-tweets-table',
templateUrl: './tweets-table.component.html',
styleUrls: ['./tweets-table.component.css'],
animations: [
trigger('detailExpand', [
state('collapsed', style({ height: '0px', minHeight: '0', visibility: 'hidden' })),
state('expanded', style({ height: '*', visibility: 'visible' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
})
export class TweetsTableComponent implements OnInit {
// Data
displayedColumns = [
'createdTime', 'tweetText', 'favoriteCount'
];
tweets: Tweet[];
expandedTweet: any;
dataSource: TweetsDataSource|null;
constructor(private tweetService: TweetService) {
}
ngOnInit() {
this.getTweets();
}
getTweets(): void {
// this.tweets = this.tweetService.getTweets(this.pageIndex, this.pageSize);
this.tweets = data;
this.dataSource = new TweetsDataSource(this.tweets);
}
isExpansionDetailRow = (i: number, row: Object) => {
row.hasOwnProperty('detailRow');
}
}
./tweets-table/tweets-table.component.html:
<div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource">
<!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" -->
<!-- Time Column -->
<ng-container matColumnDef="createdTime">
<mat-header-cell *matHeaderCellDef> Tweet Time </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.created_time}} </mat-cell>
</ng-container>
<!-- Text Column -->
<ng-container matColumnDef="tweetText">
<mat-header-cell *matHeaderCellDef> So Texty </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.text}} </mat-cell>
</ng-container>
<!-- Favs Column -->
<ng-container matColumnDef="favoriteCount">
<mat-header-cell *matHeaderCellDef> Flava Favs </mat-header-cell>
<mat-cell *matCellDef="let tweet"> {{tweet.favorite_count}} </mat-cell>
</ng-container>
<!-- Expanded Content Column - The detail row is made up of this one column -->
<ng-container matColumnDef="expandedDetail">
<mat-cell *matCellDef="let detail">
Walk before you run. Here's more text: {{detail.tweet.text}}
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"
matRipple
class="element-row"
[class.expanded]="expandedTweet == row"
(click)="expandedTweet = row"></mat-row>
<mat-row *matRowDef="let row; columns: ['expandedDetail']; when: isExpansionDetailRow"
[@detailExpand]="row.element == expandedTweet ? 'expanded' : 'collapsed'"
style="overflow: hidden">
</mat-row>
</mat-table>
</div>
我认为我的 DataSource 对象没问题。但是,我很难完全理解 MatDataSource,所以我也将其包括在内。
./tweets.datasource.ts:
import { Component, OnInit } from '@angular/core';
import { DataSource } from '@angular/cdk/collections';
import { Observable, of } from 'rxjs';
import { Tweet } from './tweet';
import { TweetService } from './tweet.service';
export class TweetsDataSource extends DataSource<Tweet> {
constructor(private tweets: Tweet[]) {
super();
}
connect(): Observable<Tweet[]> {
const rows = [];
this.tweets.forEach(element => rows.push(element, { detailRow: true, element }));
console.log('dataset rows:')
console.log(rows);
return of(this.tweets);
}
disconnect() { }
}
tweets.datasource.ts
在连接方法中,您return输入了错误的内容。它应该 return rows 而不是 this.tweets.
connect(): Observable<Tweet[]> {
const rows = [];
this.tweets.forEach(tweet => rows.push(tweet, { detailRow: true, tweet }));
console.log('dataset rows:')
console.log(rows);
return of(rows);
}
推文-table.component.ts
这也有一个错误,方法 isExpansionDetailRow 应该 return 一个布尔值 true 或 false(不是什么都不做)。所以添加 return。原始代码不需要 return 因为它只使用一行没有括号。
如果箭头函数只是 return 单行代码,您可以省略语句括号和 return 关键字。这告诉箭头函数 return 语句。参考 => https://codeburst.io/javascript-understand-arrow-function-syntax-ab4081bba85b
isExpansionDetailRow = (i: number, row: Object) => {
return row.hasOwnProperty('detailRow');
}
如果您对另一种方式感兴趣,可以参考这个问题。