Angular + Material-데이터 소스를 새로 고치는 방법 (매트 테이블)


120

사용자가 선택한 언어의 내용을 나열하기 위해 매트 테이블 을 사용하고 있습니다. 대화 패널을 사용하여 새 언어를 추가 할 수도 있습니다. 그들이 언어를 추가하고 돌아온 후. 데이터 소스를 새로 고쳐 변경 사항을 표시하고 싶습니다.

서비스에서 사용자 데이터를 가져 와서 refresh 메서드의 데이터 소스에 전달하여 데이터 저장소를 초기화합니다.

Language.component.ts

import { Component, OnInit } from '@angular/core';
import { LanguageModel, LANGUAGE_DATA } from '../../../../models/language.model';
import { LanguageAddComponent } from './language-add/language-add.component';
import { AuthService } from '../../../../services/auth.service';
import { LanguageDataSource } from './language-data-source';
import { LevelbarComponent } from '../../../../directives/levelbar/levelbar.component';
import { DataSource } from '@angular/cdk/collections';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { MatSnackBar, MatDialog } from '@angular/material';

@Component({
  selector: 'app-language',
  templateUrl: './language.component.html',
  styleUrls: ['./language.component.scss']
})
export class LanguageComponent implements OnInit {

  displayedColumns = ['name', 'native', 'code', 'level'];
  teachDS: any;
  user: any;

  constructor(private authService: AuthService, private dialog: MatDialog) { }

  ngOnInit() {
    this.refresh();
  }

  add() {
    this.dialog.open(LanguageAddComponent, {
      data: { user: this.user },
    }).afterClosed().subscribe(result => {
      this.refresh();
    });
  }

  refresh() {
    this.authService.getAuthenticatedUser().subscribe((res) => {
      this.user = res;
      this.teachDS = new LanguageDataSource(this.user.profile.languages.teach);   
    });
  }
}

language-data-source.ts

import {MatPaginator, MatSort} from '@angular/material';
import {DataSource} from '@angular/cdk/collections';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';

export class LanguageDataSource extends DataSource<any> {

  constructor(private languages) {
    super();
  }

  connect(): Observable<any> {
    return Observable.of(this.languages);
  }

  disconnect() {
    // No-op
  }

}

그래서 백엔드에서 사용자를 다시 가져온 다음 데이터 소스를 다시 초기화하는 새로 고침 메서드를 호출하려고했습니다. 그러나 이것은 작동하지 않으며 변경 사항이 없습니다.


1
"데이터 소스에서"변경을 트리거하려면 stackoverflow.com/questions/47897694/…를 참조하십시오.
Yennefer

이 경우 이벤트 이미 터를 사용할 수 있습니다. stackoverflow.com/a/44858648/8300620
Rohit Parte

답변:


58

새 데이터를받은 직후 메서드 ChangeDetectorRef에서 사용하여 변경 감지를 트리거 하고 생성자에 ChangeDetectorRefrefresh()삽입 하고 다음 과 같이 detectChanges를 사용 합니다.

import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { LanguageModel, LANGUAGE_DATA } from '../../../../models/language.model';
import { LanguageAddComponent } from './language-add/language-add.component';
import { AuthService } from '../../../../services/auth.service';
import { LanguageDataSource } from './language-data-source';
import { LevelbarComponent } from '../../../../directives/levelbar/levelbar.component';
import { DataSource } from '@angular/cdk/collections';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { MatSnackBar, MatDialog } from '@angular/material';

@Component({
  selector: 'app-language',
  templateUrl: './language.component.html',
  styleUrls: ['./language.component.scss']
})
export class LanguageComponent implements OnInit {
  displayedColumns = ['name', 'native', 'code', 'level'];
  teachDS: any;

  user: any;

  constructor(private authService: AuthService, private dialog: MatDialog,
              private changeDetectorRefs: ChangeDetectorRef) { }

  ngOnInit() {
    this.refresh();
  }

  add() {
    this.dialog.open(LanguageAddComponent, {
      data: { user: this.user },
    }).afterClosed().subscribe(result => {
      this.refresh();
    });
  }

  refresh() {
    this.authService.getAuthenticatedUser().subscribe((res) => {
      this.user = res;
      this.teachDS = new LanguageDataSource(this.user.profile.languages.teach);
      this.changeDetectorRefs.detectChanges();
    });
  }
}

9
작동하는 것 같습니다. 이것이 적절한 방법입니까? 비트 해키을 것 같은데 ...
케이

다른 방법은 무엇입니까? 완전한 답을 얻기 위해 솔루션에 예제를 제공 할 수 있습니까?
Kay


88

는 나도 몰라 ChangeDetectorRef필요했다 질문을 만들 때,하지만 지금은이 충분하다 :

import { MatTableDataSource } from '@angular/material/table';

// ...

dataSource = new MatTableDataSource<MyDataType>();

refresh() {
  this.myService.doSomething().subscribe((data: MyDataType[]) => {
    this.dataSource.data = data;
  }
}

예 :
StackBlitz


4
이 솔루션은 실제로 작동하지만 요소가 결과의 첫 페이지가 아닌 다른 곳에 추가되면 머티리얼 페이지 지정자를 엉망으로 만듭니다. 나는 그것이이 질문의 범위를 벗어난다는 것을 이해하지만 두 가지가 관련되어 있기 때문에 답변에 추가 할 수있는 문제에 대한 빠른 해결책이 있습니까?
Knight

5
@Knight 나는 MatTableDataSource.paginatorPaginator의 뷰가 초기화 된 후에 속성에 Paginator를 할당해야한다고 생각합니다 . 의 설명을 참조하십시오 paginator여기에 속성을 : material.angular.io/components/table/api#MatTableDataSource
마틴 슈나이더

좋은 참조. 나는 이전에 문서에서 그것을 발견하지 못했습니다. 감사!
Knight

2
@ MA-Maddin을 어떻게 수행하는지 더 구체적으로 말씀해 주시겠습니까? 예?
Nathanphan 2018

예를 늦게 @Nathanphan하지만 추가)
마틴 슈나이더에게

46

그래서 나를 위해 아무도 내가 만난 문제에 대해 @Kay와 거의 같은 좋은 대답을주지 않았습니다. 나에게 그것은 정렬에 관한 것이고, 정렬 테이블은 매트에서 변경이 발생하지 않습니다. 이 답변은 Google 검색을 통해 찾은 유일한 주제이기 때문에 목적이 있습니다. Angular 6을 사용하고 있습니다.

여기에 말했듯 :

테이블은 성능을 최적화하므로 데이터 배열의 변경 사항을 자동으로 확인하지 않습니다. 대신 데이터 배열에서 객체를 추가, 제거 또는 이동할 때 renderRows () 메서드를 호출하여 테이블의 렌더링 된 행에 대한 업데이트를 트리거 할 수 있습니다.

따라서 변경 사항이 표시되도록 refresh () 메서드 에서 renderRows () 를 호출하기 만하면 됩니다.

통합 은 여기 를 참조 하십시오 .


1
클라이언트에서 테이블 데이터 소스가 변경된 경우이 대답은 아마도 찾고있는 것입니다. 잘 작동합니다!
Alvin Saldanha

이는 각 재료 (8)과 정답이다

감사합니다. 그러나 어떤 객체에서 "renderRows ()"를 호출해야합니까? 'this.datasource'에 있습니까?
WitnessTruth

19

을 사용하고 있기 때문에 페이지 MatPaginator지정자 만 변경하면 데이터가 다시로드됩니다.

간단한 트릭 :

this.paginator._changePageSize(this.paginator.pageSize); 

이것은 페이지 크기를 현재 페이지 크기로 업데이트하므로 기본적으로 private _emitPageEvent()함수가 호출되어 테이블 다시로드를 트리거 하는 것을 제외하고는 아무것도 변경되지 않습니다 .


귀하의 코드를 시도했지만 작동하지 않습니다 (효과 없음). 그러나 nextPage와 previousPage가 다시 작동하지만 해결책은 없습니다.
Ahmed Hasn.

_changePageSize()공개 권이 아닌가? 사용하는 것이 안전합니까? stackoverflow.com/questions/59093781/…에서
Jones

9
this.dataSource = new MatTableDataSource<Element>(this.elements);

특정 행을 추가하거나 삭제하는 작업 아래에이 행을 추가하십시오.

refresh() {
  this.authService.getAuthenticatedUser().subscribe((res) => {
    this.user = new MatTableDataSource<Element>(res);   
  });
}

this.elements
parvat

8

이를 수행하는 가장 좋은 방법은 데이터 소스 구현에 Observable을 추가하는 것입니다.

connect 메소드 Observable.merge에서 paginator.page, sort.sortChange 등을 포함하는 Observable 배열을 구독하기 위해 이미 사용 하고 있어야 합니다. 여기에 새 주제를 추가하고 새로 고침해야 할 때 next를 호출 할 수 있습니다.

이 같은:

export class LanguageDataSource extends DataSource<any> {

    recordChange$ = new Subject();

    constructor(private languages) {
      super();
    }

    connect(): Observable<any> {

      const changes = [
        this.recordChange$
      ];

      return Observable.merge(...changes)
        .switchMap(() => return Observable.of(this.languages));
    }

    disconnect() {
      // No-op
    }
}

그런 다음 전화 recordChange$.next()를 걸어 새로 고침을 시작할 수 있습니다 .

당연히 호출을 refresh () 메서드로 래핑하고 구성 요소 및 기타 적절한 기술이있는 데이터 소스 인스턴스에서 호출합니다.


이 방법은 올바른 방법 일 수 있습니다. 그것은 나를 위해 잘 작동합니다
Manu

MatTableDataSource를 확장하고 싶을 때 어떻게 구현합니까? 코드 예제를 시도하면 오류가 발생합니다Property 'connect' in type 'customDataSource<T>' is not assignable to the same property in base type 'MatTableDataSource<T>'. Type '() => Observable<any>' is not assignable to type '() => BehaviorSubject<T[]>'. Type 'Observable<any>' is not assignable to type 'BehaviorSubject<T[]>'. Property '_value' is missing in type 'Observable<any>'.
Maurice

1
@Maurice MatTableDataSource 유형은 다른 반환 유형으로 연결 메서드를 구현합니다. BehaviorSubject <t []>를 사용하므로 Observable 대신이를 반환하기 위해 예제를 변경하면됩니다. 여전히 DataSource를 사용할 수 있어야하지만 MatTableDataSource를 사용해야하는 경우 시작할 것이 있다고 가정하고 Observable에 구독 된 BehaviorSubject를 반환합니다. 도움이 되었기를 바랍니다. 새 데이터 소스 유형의 정확한 구문은 MatTableDataSource의 소스를 참조 할 수 있습니다. github.com/angular/material2/blob/master/src/lib/table/…
jogi

7

데이터 소스 연결 기능을 사용할 수 있습니다.

this.datasource.connect().next(data);

그렇게. 데이터 테이블의 새 값인 '데이터'


잠재력이 있었지만 작동하지 않는 것 같습니다. 그 후에 this.datasource.data에 액세스하면 업데이트되지 않습니다.
Rui Marques

4

"concat"을 사용하여 테이블의 데이터를 쉽게 업데이트 할 수 있습니다.

예를 들면 :

language.component.ts

teachDS: any[] = [];

language.component.html

<table mat-table [dataSource]="teachDS" class="list">

그리고 데이터 (language.component.ts)를 업데이트 할 때 :

addItem() {
    // newItem is the object added to the list using a form or other way
    this.teachDS = this.teachDS.concat([newItem]);
 }

"concat"각도를 사용할 때 객체 (this.teachDS)의 변경 사항을 감지하고 다른 것을 사용할 필요가 없습니다.

PD : 앵귤러 6과 7에서 작동합니다. 다른 버전은 시도하지 않았습니다.


2
예, 저에게 효과적이며 참조 및 값 var에 대한 문제이며 변경 감지는 새로운 변경 사항을 보지 못하므로 업데이트해야합니다.
Mayra Rodriguez 2019

이것은 dataSource가 배열 일 때 작동하지만 dataSource가 MatTableDataSource 객체 일 때는 작동하지 않을 수 있습니다.
Rui Marques


3

글쎄, 데이터 소스에 무언가를 추가했는데 다시로드되지 않는 비슷한 문제가 발생했습니다.

내가 찾은 가장 쉬운 방법은 단순히 데이터를 재 할당하는 것입니다.

let dataSource = ['a','b','c']
dataSource.push('d')
let cloned = dataSource.slice()
// OR IN ES6 // let cloned = [...dataSource]
dataSource = cloned

완전한!! 그것은 wokrs !! 감사합니다 :)
Nicolas

3

Angular 9에서 비밀은 this.dataSource.data = this.dataSource.data;

예:

import { MatTableDataSource } from '@angular/material/table';

dataSource: MatTableDataSource<MyObject>;

refresh(): void {
    this.applySomeModif();
    // Do what you want with dataSource

    this.dataSource.data = this.dataSource.data;
}

applySomeModif(): void {
    // add some data
    this.dataSource.data.push(new MyObject());
    // delete index number 4
    this.dataSource.data.splice(4, 0);
}

2

두 가지 리소스를 사용하여 좋은 솔루션을 얻었습니다.

dataSource 및 paginator 모두 새로 고침 :

this.dataSource.data = this.users;
this.dataSource.connect().next(this.users);
this.paginator._changePageSize(this.paginator.pageSize);

예를 들어 dataSource 는 여기에 정의되어 있습니다.

    users: User[];
    ...
    dataSource = new MatTableDataSource(this.users);
    ...
    this.dataSource.paginator = this.paginator;
    ...

1
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

export class LanguageComponent implemnts OnInit {
  displayedColumns = ['name', 'native', 'code', 'leavel'];
  user: any;
  private update = new Subject<void>();
  update$ = this.update.asObservable();

  constructor(private authService: AuthService, private dialog: MatDialog) {}

   ngOnInit() {
     this.update$.subscribe(() => { this.refresh()});
   }

   setUpdate() {
     this.update.next();
   }

   add() {
     this.dialog.open(LanguageAddComponent, {
     data: { user: this.user },
   }).afterClosed().subscribe(result => {
     this.setUpdate();
   });
 }

 refresh() {
   this.authService.getAuthenticatedUser().subscribe((res) => {
     this.user = res;
     this.teachDS = new LanguageDataSource(this.user.profile.languages.teach);   
    });
  }
}

8
답변에 설명을 추가하십시오. 코드를 게시하는 것은 그다지 도움이되지 않으며 답변이 삭제 될 수 있습니다.
TJ Wolschon 2018

1

제 경우에는 (Angular 6+)에서 상속 MatTableDataSource하여 MyDataSource. 호출하지 않고this.data = someArray

this.entitiesSubject.next(this.data as T[])

표시되지 않은 데이터

MyDataSource 클래스

export class MyDataSource<T extends WhateverYouWant> extends MatTableDataSource<T> {

    private entitiesSubject = new BehaviorSubject<T[]>([]);


    loadDataSourceData(someArray: T[]){
        this.data = someArray //whenever it comes from an API asyncronously or not
        this.entitiesSubject.next(this.data as T[])// Otherwise data not displayed
    }

    public connect(): BehaviorSubject<T[]> {
        return this.entitiesSubject
    }

}//end Class 

1

Angular Material이 일관성이 없기 때문에 두 가지 방법이 있습니다. 이것은 매우 잘 문서화되어 있지 않습니다. 새 행이 도착해도 각도 재료 테이블이 업데이트되지 않습니다. 놀랍게도 성능 문제 때문이라고합니다. 그러나 그것은 디자인 문제처럼 보이지만 변경할 수 없습니다. 새 행이 발생할 때 테이블이 업데이트되어야합니다. 이 동작이 기본적으로 활성화되어 있지 않아야하는 경우이를 끄는 스위치가 있어야합니다.

어쨌든 Angular Material은 변경할 수 없습니다. 그러나 우리는 기본적으로 매우 잘 문서화되지 않은 방법을 사용할 수 있습니다.

하나-어레이를 소스로 직접 사용하는 경우 :

call table.renderRows()

여기서 table은 mat-table의 ViewChild입니다.

둘째-정렬 및 기타 기능을 사용하는 경우

table.renderRows () 놀랍게도 작동하지 않습니다. 매트 테이블이 여기에서 일치하지 않기 때문입니다. 소스가 변경되었음을 알리려면 해킹을 사용해야합니다. 이 방법으로 수행합니다.

this.dataSource.data = yourDataSource;

여기서 dataSource는 정렬 및 기타 기능에 사용되는 MatTableDataSource 래퍼입니다.


0

이것은 나를 위해 일했습니다.

refreshTableSorce() {
    this.dataSource = new MatTableDataSource<Element>(this.newSource);
}

테이블에 대한 소스를 다시 생성하므로 이상적인 솔루션이 아니며이를 간소화 된 소켓과 함께 사용하는 것은 효율적이지 않습니다.
Maihan Nijat 2018

0

MatTableDataSource객체는 MatTableDataSource생성자 에게 전달하는 데이터 배열과 어떤 식 으로든 연결되어 있다고 생각합니다 .

예를 들면 :

dataTable: string[];
tableDS: MatTableDataSource<string>;

ngOnInit(){
   // here your pass dataTable to the dataSource
   this.tableDS = new MatTableDataSource(this.dataTable); 
}

따라서 데이터를 변경해야 할 때; 원래 목록 dataTable에서 변경 한 다음에서 호출 _updateChangeSubscription()메서드로 테이블에 변경 사항을 반영합니다 tableDS.

예를 들면 :

this.dataTable.push('testing');
this.tableDS._updateChangeSubscription();

그것은 Angular 6을 통해 저와 함께 일합니다.


4
그 방법은 밑줄로 시작 _하고 당신은 그것을 호출합니까?
Stephane 2018

0

이것은 나를 위해 일하고 있습니다.

dataSource = new MatTableDataSource<Dict>([]);
    public search() {
        let url = `${Constants.API.COMMON}/dicts?page=${this.page.number}&` + 
        (this.name == '' ? '' : `name_like=${this.name}`);
    this._http.get<Dict>(url).subscribe((data)=> {
    // this.dataSource = data['_embedded'].dicts;
    this.dataSource.data =  data['_embedded'].dicts;
    this.page = data['page'];
    this.resetSelection();
  });
}

따라서 데이터 소스 인스턴스를 다음과 같이 선언해야합니다. MatTableDataSource


0

나는 더 많은 조사를했고 내가 필요한 것을 제공하기 위해 이곳을 찾았습니다. 서버에서 새로 고칠 때 깨끗하고 업데이트 데이터와 관련이 있습니다 : https://blog.angular-university.io/angular-material-data-table/

위 페이지에 대한 대부분의 크레딧. 다음은 선택 변경시 데이터 소스에 바인딩 된 매트 테이블을 업데이트하는 데 매트 선택기를 사용하는 방법에 대한 샘플입니다. 저는 Angular 7을 사용하고 있습니다. 광범위하고 완전하지만 간결하게 노력해서 죄송합니다. 필요하지 않은 부분을 최대한 많이 뜯어 냈습니다. 다른 사람이 더 빨리 나아갈 수 있도록 도와 주길 바라며!

organization.model.ts :

export class Organization {
    id: number;
    name: String;
}

organization.service.ts :

import { Observable, empty } from 'rxjs';
import { of } from 'rxjs';

import { Organization } from './organization.model';

export class OrganizationService {
  getConstantOrganizations(filter: String): Observable<Organization[]> {
    if (filter === "All") {
      let Organizations: Organization[] = [
        { id: 1234, name: 'Some data' }
      ];
      return of(Organizations);
     } else {
       let Organizations: Organization[] = [
         { id: 5678, name: 'Some other data' }
       ];
     return of(Organizations);
  }

  // ...just a sample, other filterings would go here - and of course data instead fetched from server.
}

organizationdatasource.model.ts :

import { CollectionViewer, DataSource } from '@angular/cdk/collections';
import { Observable, BehaviorSubject, of } from 'rxjs';
import { catchError, finalize } from "rxjs/operators";

import { OrganizationService } from './organization.service';
import { Organization } from './organization.model';

export class OrganizationDataSource extends DataSource<Organization> {
  private organizationsSubject = new BehaviorSubject<Organization[]>([]);

  private loadingSubject = new BehaviorSubject<boolean>(false);

  public loading$ = this.loadingSubject.asObservable();

  constructor(private organizationService: OrganizationService, ) {
    super();
  }

  loadOrganizations(filter: String) {
    this.loadingSubject.next(true);

    return this.organizationService.getOrganizations(filter).pipe(
      catchError(() => of([])),
      finalize(() => this.loadingSubject.next(false))
    ).subscribe(organization => this.organizationsSubject.next(organization));
  }

  connect(collectionViewer: CollectionViewer): Observable<Organization[]> {
    return this.organizationsSubject.asObservable();
  }

  disconnect(collectionViewer: CollectionViewer): void {
    this.organizationsSubject.complete();
    this.loadingSubject.complete();
  }
}

organization.component.html :

<div class="spinner-container" *ngIf="organizationDataSource.loading$ | async">
    <mat-spinner></mat-spinner>
</div>

<div>
  <form [formGroup]="formGroup">
    <mat-form-field fxAuto>
      <div fxLayout="row">
        <mat-select formControlName="organizationSelectionControl" (selectionChange)="updateOrganizationSelection()">
          <mat-option *ngFor="let organizationSelectionAlternative of organizationSelectionAlternatives"
            [value]="organizationSelectionAlternative">
            {{organizationSelectionAlternative.name}}
          </mat-option>
        </mat-select>
      </div>
    </mat-form-field>
  </form>
</div>

<mat-table fxLayout="column" [dataSource]="organizationDataSource">
  <ng-container matColumnDef="name">
    <mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
    <mat-cell *matCellDef="let organization">{{organization.name}}</mat-cell>
  </ng-container>

  <ng-container matColumnDef="number">
    <mat-header-cell *matHeaderCellDef>Number</mat-header-cell>
    <mat-cell *matCellDef="let organization">{{organization.number}}</mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>

organization.component.scss :

.spinner-container {
    height: 360px;
    width: 390px;
    position: fixed;
}

organization.component.ts :

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
import { Observable } from 'rxjs';

import { OrganizationService } from './organization.service';
import { Organization } from './organization.model';
import { OrganizationDataSource } from './organizationdatasource.model';

@Component({
  selector: 'organizations',
  templateUrl: './organizations.component.html',
  styleUrls: ['./organizations.component.scss']
})
export class OrganizationsComponent implements OnInit {
  public displayedColumns: string[];
  public organizationDataSource: OrganizationDataSource;
  public formGroup: FormGroup;

  public organizationSelectionAlternatives = [{
    id: 1,
    name: 'All'
  }, {
    id: 2,
    name: 'With organization update requests'
  }, {
    id: 3,
    name: 'With contact update requests'
  }, {
    id: 4,
    name: 'With order requests'
  }]

  constructor(
    private formBuilder: FormBuilder,
    private organizationService: OrganizationService) { }

  ngOnInit() {
    this.formGroup = this.formBuilder.group({
      'organizationSelectionControl': []
    })

    const toSelect = this.organizationSelectionAlternatives.find(c => c.id == 1);
    this.formGroup.get('organizationSelectionControl').setValue(toSelect);

    this.organizationDataSource = new OrganizationDataSource(this.organizationService);
    this.displayedColumns = ['name', 'number' ];
    this.updateOrganizationSelection();
  }

  updateOrganizationSelection() {
    this.organizationDataSource.loadOrganizations(this.formGroup.get('organizationSelectionControl').value.name);
  }
}

0

Post data update # 11638 Bug Report를 업데이트하지 않는 Material Table을 읽은 후 , EventEmitter를 사용하라는 제안과 함께 최종 댓글 작성자 'shhdharmen'이 제안한 가장 좋은 방법 (읽기, 가장 쉬운 해결책)을 찾았습니다.

여기에는 생성 된 데이터 소스 클래스에 대한 몇 가지 간단한 변경이 포함됩니다.

ie) 데이터 소스 클래스에 새 개인 변수 추가

import { EventEmitter } from '@angular/core';
...
private tableDataUpdated = new EventEmitter<any>();

새 데이터를 내부 배열 (this.data)로 푸시하면 이벤트를 내 보냅니다.

public addRow(row:myRowInterface) {
    this.data.push(row);
    this.tableDataUpdated.emit();
}

마지막으로 'connect'메서드에서 'dataMutation'배열을 다음과 같이 변경합니다.

const dataMutations = [
    this.tableDataUpdated,
    this.paginator.page,
    this.sort.sortChange
];

0

// 이것은 dataSource입니다
this.guests = [];

this.guests.push ({id : 1, 이름 : 'Ricardo'});

// 데이터 소스를 새로 고칩니다. this.guests = Array.from (this.guest);


0
npm install @matheo/datasource

저는 앞으로 모든 종류의 입력 스트림 (정렬, 페이지 매김, 필터) 및 디버깅을 포함한 일부 구성을 지원하여 코딩하는 동안 작동 방식을 확인하는 공식 Material DataSource를 목표로하는 라이브러리를 출시했습니다.

import { MatDataSourceModule } from '@matheo/datasource';

StackBlitz 데모 및 추가 정보는 https://medium.com/@matheo/reactive-datasource-for-angular-1d869b0155f6 에서 찾을 수 있습니다.

귀하의 의견을 듣고 필요한 경우 사용 사례를 지원하게되어 기쁩니다.
즐거운 코딩 되세요!


0

ChangeDetectorRef, Subject 및 BehaviourSubject를 시도했지만 저에게 적합한 것은 무엇입니까?

dataSource = [];
this.dataSource = [];
 setTimeout(() =>{
     this.dataSource = this.tableData[data];
 },200)

여기서 무슨 일이 일어나고 있습니까? 변수 이름 지정 실수를 한 것 같습니다.
ChumiestBucket
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.