【问题标题】:Angular Material 2: How to refresh md-table after editing a record?Angular Material 2:编辑记录后如何刷新 md-table?
【发布时间】:2017-07-24 19:09:00
【问题描述】:

所以我有一个用户列表组件和一个用户详细信息组件。

用户列表组件有一个 md 表,列出了所有注册的用户。用户可以点击一个按钮来查看相应实体的详细信息。

编辑 Name 属性并保存(例如)后,用户详细信息重定向到用户列表组件。但是 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 { }}

【问题讨论】:

    标签: angular-material2


    【解决方案1】:

    connect() 提供的流发出新值时,表格将重新呈现。

    getAllUsers 需要在更改时发出一组新数据。否则,从_userService 监听一个单独的流(例如dataChanged)并使用它再次调用getAllUsers

    connect(): Observable<UserVModel[]> {
      return this._userService.dataChanged
          .switchMap(() => this._userService.getAllUsers()
    }
    

    【讨论】:

    • 非常感谢您的回答。它引导我找到正确的方向,以找出我的应用程序出了什么问题。我认为这两个答案对于从角度和材料 2 开始的人来说都具有很大的价值。
    • 我必须开发一个删除程序,然后我使用这种方法来达到预期的结果。唯一的事情是我必须在 .switchMap 之前在我的 dataChanged observable 中包含一个 .Delay(250)。否则它将在实体框架完成更新它的缓存或其他东西之前触发 getAllUsers 服务,并最终返回相同的旧数据。可能不是最好的方法,但它是我发现的唯一正确的方法。
    • 我想您会希望 dataChanged 基于实体框架完成其任务,而不是触发数据库更改。如果您正在创建任意延迟,则您要求竞争条件
    • 您对我该怎么做有什么建议吗?非常感谢。
    • 无法访问您的应用架构以及如何从数据库中存储/检索内容,我认为我无法提供太多帮助
    【解决方案2】:

    实际上,问题在于 User-Detail 组件在 observable 有机会完成之前就被重定向了。所以我把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 可观察对象即可获得最新值。

    【讨论】:

      【解决方案3】:

      您可以整理一下并将您的路由器导航放在响应中:

      onSubmit() {
      this._updateSub = this._service.updateUser(this._id, 
      this._userForm.value).subscribe(
         res => this._router.navigate(['/user']);
         err => this.onSubmitError(err), () => this.afterSubmit());
      }
      

      【讨论】:

      • 如果我这样做,我最终会在实体框架完成它的工作之前重定向。我以前试过。唯一可行的方法是,如果我在可观察完成上重定向。它让数据库有时间进行更改并更新缓存。
      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多