【问题标题】:Closing Angular 1.5 Material mdDialog from controller从控制器关闭 Angular 1.5 Material mdDialog
【发布时间】:2016-12-08 19:21:26
【问题描述】:

在一个 Angular 1.5 组件中,我展示了一个 Material mdDialog,它本身有一个嵌入式组件:

                $mdDialog.show({
                        controller: function($scope, $log) {
                          $scope.notify=function() {
                            $log.debug("need to cancel");
                            $mdDialog.hide();
                          }
                        },
                        template: "<md-dialog aria-label='Add Foobar'><new-foobar-panel on-cancel='notify()'></new-foobar-panel></md-dialog>",
                        targetEvent: ev,
                        clickOutsideToClose: true,
                        fullscreen: true
                    });

当嵌入式组件调用onCancel() 回调时,对话框的控制器使用$mdDialog.hide() 关闭对话框。

但这似乎有点乱。 $mdDialog 的文档说它将关闭最后打开的对话框,但这似乎有点懒惰和一厢情愿。我敢肯定,在某些情况下,许多组件和对话框会导致此操作失败。毕竟我在对话框的控制器中 --- 不应该有对可以用来直接关闭它的对话框实例的引用吗?

我试过了:

                var dialog = $mdDialog.show({
                        controller: function($scope, $log) {
                          $scope.notify=function() {
                            $log.debug("need to cancel");
                            dialog.hide();
                          }

但这不起作用;也许返回的是一个承诺而不是一个对话框。

所以我是否坚持致电$mdDialog.hide()(全球服务!!)并希望这指的是我正在使用的对话框? (这不是很好的模块化。)

【问题讨论】:

    标签: angularjs angular-material


    【解决方案1】:

    其实documentation说的是

    // Close the specified dialog instance and resolve with 'finished' flag
    // Normally this is not needed, just use '$mdDialog.hide()' to close
    // the most recent dialog popup.
    
    function closeAlert() {
      $mdDialog.hide( alert, "finished" );
      alert = undefined;
    }
    

    其中alert 是先前构建的对话框实例。所以如果你真的需要引用一个特定的对话框实例而不是最后一个,你可以使用上面的方法来关闭它。

    【讨论】:

    • 哦,我明白了!我错过了。正是我想要的。谢谢!
    • 很奇怪:当我使用$mdDialog.hide(dialog, "finished") 时,永远不会调用.then(function(answer)!我设置了一个断点和一切,但它从来没有命中它。会发生什么?
    • 实际上$mdDialog.cancel(dialog) 似乎会解决promise,但$mdDialog.hide(dialog) 不会!我可以得到$mdDialog.hide() 来解决对话框,但不是$mdDialog.hide(dialog)。肯定有什么我做错了。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2016-03-16
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多