table component如何重新載入?

大家好,本人剛學完不久,目前專案使用angular material

專案的畫面規劃主要分成三個部分:上、左、右。

上面就是 標題列跟工具列。
左邊則是 樹狀選單,點選之後,會根據類型讀取對應的內容
右邊則是 table(電腦)或是list card(手機)顯示上述的內容

舉例:在左邊點了Student,會取得所有Student的內容,並顯示在右邊
點了Teacher,會取得所有Teacher的內容並顯示在右邊
網址的變化是:http://localhost/Student --> http://localhost/Teacher

目前routing如下:

const routes: Routes = [
  {
    path: 'login',
component: LoginComponent,
  },
  {
    path: '',
    component: HomeComponent,
    canActivate: [AuthGuard],
    children: [
      {
        path: ':type',
        component: ItemComponent,
      }
    ]
  },
];

右邊目前是一個item component,會根據是電腦或是手機來決定顯示的方式:
html code如下:(手機的部分還沒開始寫)

<!-- 手機顯示樣式 -->
<ng-container *ngIf="isMobile$|async; else elseTemplate">
  <!-- <app-item-card *ngFor="let item of items" [item]="item" (dblclick)="onDbClickRow(item)"></app-item-card> -->
</ng-container>
<!-- 電腦顯示樣式 -->
<ng-template #elseTemplate>
  <app-table></app-table>
  <!-- <router-outlet></router-outlet> -->
</ng-template>

現在碰的問題是:因為我把table拉出來成為shared的component,請問如果換成其他的類型的時候(如:Teacher)該怎麼重新載入table?

table是參考以下網址中的Table retrieving data through HTTP
https://material.angular.io/components/table/examples

因為範例程式是寫在ngAfterViewInit,我不知道該怎麼讓item component知會table component內容改變了,或是說table component要砍掉,根據目前param重新顯示。

table.component的程式如下:

displayedColumns = [];

data = [];

resultsLength = 0;

@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;

constructor(
private route: ActivatedRoute,
private router: Router,
private tableService: TableService
) { }
type: string;

ngAfterViewInit() {
this.paginator.page
  .pipe(
	startWith({}),
	switchMap(() => {
	  const type = this.route.snapshot.params.type;
	  return this.tableService.getItems(type, this.paginator.pageIndex);
	}),
	map(data => {
	  const itemState = data.payload;
	  this.resultsLength = +itemState.data.Item[0]['@itemmax'];
	  if (this.displayedColumns.length === 0) {
		const property: [] = itemState.template['property']['Item'];
		for (const p of property) {
		  const obj = { title: p['label']['#text'], name: p['name'] };
		  this.displayedColumns.push(obj);
		}
	  }
	return itemState.data.Item;
	}),
	catchError(() => {
	  return of([]);
	})
  ).subscribe(data => this.data = data);
}

或是有其他比較好的作法?

ActivatedRoute 的 params 也是 Observable, 跟 paginator 合併處理一下就可以達到 type 異動也會重新撈資料的效果

1個讚

感謝Kevin您的回答,我才想到原來可以用merge來處理(對rxjs非常不熟)

就像以下的方式

merge(this.route.params, this.paginator.page).pipe(…)

可以去看看combinelatest 這一個方法