我正在使用mat- table列出用户选择的语言的内容。他们还可以使用对话面板添加新语言。在他们添加了一种语言并返回后。我希望我的数据源刷新以显示他们所做的更改。
我通过从服务获取用户数据并将其传递到刷新方法中的数据源来初始化数据存储。
语言.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); }); } }
语言数据源.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 } }
所以我尝试调用一个刷新方法,再次从后端获取用户,然后重新初始化数据源。但是,这不起作用,没有发生任何变化。
在接收到新数据后,通过ChangeDetectorRef在方法中使用触发更改检测,在构造函数中注入ChangeDetectorRef并像这样使用detectChanges:refresh()
ChangeDetectorRef
refresh()
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(); }); } }