Angular Material 2:如何在编辑记录后刷新md-table?
Angular Material 2: How to refresh md-table after editing a record?
所以我有一个用户列表组件和一个用户详细信息组件。
用户列表组件有一个 md-table 列出所有注册的用户。用户可以单击按钮查看相应实体的详细信息。
编辑名称 属性 并保存(例如)后,用户详细信息重定向到用户列表组件。但是 md-table 显示旧信息。
在这种情况下,如何在另一个组件中编辑实体后触发 md-table 刷新?
这是我的用户列表组件:
export class UserListComponent implements OnInit {
tableDisplayedColumns: string[] = ['userName', 'email', 'options'];
userDataSource: UserDataSource;
constructor(private _userService: UserService, private _router: Router) { }
ngOnInit(): void {
this.userDataSource = new UserDataSource(this._userService);
}}
class UserDataSource extends DataSource<UserVModel> {
constructor(private _userService: UserService) {
super();
}
connect(): Observable<UserVModel[]> {
return this._userService.getAllUsers();
}
disconnect(): void { }}
table 将在 connect()
提供的流发出新值时重新呈现。
getAllUsers
需要在更改时发出一组新数据。否则,从 _userService
中监听一个单独的流(例如 dataChanged
)并使用它再次调用 getAllUsers
。
connect(): Observable<UserVModel[]> {
return this._userService.dataChanged
.switchMap(() => this._userService.getAllUsers()
}
实际上问题在于 User-Detail 组件在可观察对象有机会完成之前进行了重定向。所以我把 router.navigate 作为一个完整的函数。
之前的代码
onSubmit() {
this._updateSub = this._service.updateUser(this._id, this._userForm.value)
.subscribe(null, err => this.onSubmitError(err));
this._router.navigate(['/user']);
}
代码在
之后
onSubmit() {
this._updateSub = this._service.updateUser(this._id, this._userForm.value)
.subscribe(null, err => this.onSubmitError(err), () => this.afterSubmit());
}
afterSubmit() {
this._router.navigate(['/user']);
}
在此更改之前,我在重定向后得到的是旧值。使用完整的函数,我无需在服务中使用 dataChanged observable 即可获得最新值。
您可以整理一下并将您的路由器导航放在响应中:
onSubmit() {
this._updateSub = this._service.updateUser(this._id,
this._userForm.value).subscribe(
res => this._router.navigate(['/user']);
err => this.onSubmitError(err), () => this.afterSubmit());
}
所以我有一个用户列表组件和一个用户详细信息组件。
用户列表组件有一个 md-table 列出所有注册的用户。用户可以单击按钮查看相应实体的详细信息。
编辑名称 属性 并保存(例如)后,用户详细信息重定向到用户列表组件。但是 md-table 显示旧信息。
在这种情况下,如何在另一个组件中编辑实体后触发 md-table 刷新?
这是我的用户列表组件:
export class UserListComponent implements OnInit {
tableDisplayedColumns: string[] = ['userName', 'email', 'options'];
userDataSource: UserDataSource;
constructor(private _userService: UserService, private _router: Router) { }
ngOnInit(): void {
this.userDataSource = new UserDataSource(this._userService);
}}
class UserDataSource extends DataSource<UserVModel> {
constructor(private _userService: UserService) {
super();
}
connect(): Observable<UserVModel[]> {
return this._userService.getAllUsers();
}
disconnect(): void { }}
table 将在 connect()
提供的流发出新值时重新呈现。
getAllUsers
需要在更改时发出一组新数据。否则,从 _userService
中监听一个单独的流(例如 dataChanged
)并使用它再次调用 getAllUsers
。
connect(): Observable<UserVModel[]> {
return this._userService.dataChanged
.switchMap(() => this._userService.getAllUsers()
}
实际上问题在于 User-Detail 组件在可观察对象有机会完成之前进行了重定向。所以我把 router.navigate 作为一个完整的函数。
之前的代码
onSubmit() {
this._updateSub = this._service.updateUser(this._id, this._userForm.value)
.subscribe(null, err => this.onSubmitError(err));
this._router.navigate(['/user']);
}
代码在
之后onSubmit() {
this._updateSub = this._service.updateUser(this._id, this._userForm.value)
.subscribe(null, err => this.onSubmitError(err), () => this.afterSubmit());
}
afterSubmit() {
this._router.navigate(['/user']);
}
在此更改之前,我在重定向后得到的是旧值。使用完整的函数,我无需在服务中使用 dataChanged observable 即可获得最新值。
您可以整理一下并将您的路由器导航放在响应中:
onSubmit() {
this._updateSub = this._service.updateUser(this._id,
this._userForm.value).subscribe(
res => this._router.navigate(['/user']);
err => this.onSubmitError(err), () => this.afterSubmit());
}