【问题标题】:Implementing angular material dialog box with candeactive使用candeactive实现角度材质对话框
【发布时间】:2018-06-30 20:13:42
【问题描述】:

在candeactive中实现angular 4材质对话框时遇到的问题

每当我从一个页面导航到另一个页面时,如果表单字段有任何变化, 我需要指出“有未保存的数据。您要关闭吗”。 这应该会出现带有确定和取消按钮的确认窗口。

单击确定后,它应该导航到其他页面,否则它必须在同一页面中。 我已经尝试过使用candeactive,当我使用window.confirm时它可以完美地工作

 return window.confirm('There is unsaved data.Do you want to close?').

但我的要求是使用 Angular 材质对话框实现确认窗口。 https://material.angular.io/components/dialog/overview

问题出在从 afterClosd 检索结果之前。它返回 false。因此,每当我在对话框中单击“确定”或“取消”时,它都不会移动到另一个屏幕。

openDialog(): boolean {
    let dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
      width: '500px'

    });

    dialogRef.afterClosed().subscribe(result => {           
      if (result){
         return true;
      }else{
        return false;
      } 
    });
   return false;

  }

【问题讨论】:

    标签: angular angular-material2 angular4-forms dirty-checking


    【解决方案1】:

    我假设您没有在文档中看到这部分?

    <button mat-button mat-dialog-close>Cancel</button>
    <button mat-button [mat-dialog-close]="true">Leave</button>
    

    另外,你应该删除你最后的return false 声明:

    dialogRef.afterClosed().subscribe(result => {           
      if (result){
         return true;
      }else{
        return false;
      } 
    });
    // return false;
    

    模式是异步,正如您在subscribe 中看到的那样:这意味着您在返回某些内容之前正在等待用户交互。

    在您的情况下,您在用户操作之前返回 false

    【讨论】:

    • 嗨.. 这里我的方法 openDialog() 必须返回布尔值。所以如果我评论那一行“return false”,它会给我一个错误。问题是它在没有等待 afterClosed() 方法的情况下返回了 false。那么当导航到其他屏幕时,是否有任何解决方法或任何其他方式来实现使用带有脏更改的角度对话框。
    • 只需return dialogRef.afterClosed() 应该可以工作。 CanDeactivate 接口可以返回布尔值、布尔值的承诺或布尔值的可观察值。
    • 我已经尝试过这种方法。它不工作。同样的问题
    • 奇怪,因为 it works for me。你确定你正确地实施了你的守卫吗?
    • 我认为 canDeactive 工作正常。仅在角度材料对话框中出现问题。在对话框打开之前,会返回值。所以只有它没有导航到其他屏幕。
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2021-08-22
    • 2017-11-02
    • 2017-12-19
    相关资源
    最近更新 更多