2016-09-02 58 views
2

我有一个使用Angular Material UI框架的AngularJS应用程序。使用角度材质,是否可以关闭特定对话框

该应用程序具有显示对话框(例如错误和加载旋转器)不同的机制,这将是优选的在某些情况下专门选择仅靠近之一,例如当一个AJAX请求完成获取数据时,我希望我的加载微调器关闭,但不会有任何错误对话框,这可能是抓取的结果。

我可以在文档中找到和代码不同意(尽管代码应该赢得争论):

  • Documentation只有最新的说
  • The code说,可以关闭,使用可选的响应最新的,一些最新的或所有打开的,可以关闭,可选原因
  • Example in the documentation说具体的对话可以关闭,用的标记,表示如何或为何

我已经做了demo of my intent,作为MCV地 - 这些都是亮点:

var dialog = {}, 
    promise = {}; 

function showDialogs(sourceEvent) { 
    showDialog(sourceEvent, "one"); 
    showDialog(sourceEvent, "two"); 
} 

function showDialog(sourceEvent, id) { 
    dialog[id] = $mdDialog.alert({...}); 

    promise[id] = $mdDialog.show(dialog[id]); 
    promise[id].finally(function() { 
     dialog[id] = undefined; 
    }); 
} 

function closeDialogs() { 
    $mdDialog.hide("Closed all for a reason", {closeAll: true}); 
} 

function closeDialogLatest() { 
    $mdDialog.hide("Closed from the outside"); 
} 

function closeDialogReason() { 
    $mdDialog.hide("Closed with a reason"); 
} 

function closeDialogSpecific(id) { 
    $mdDialog.hide(dialog[id], "finished"); 
} 

编辑:
我知道代码总是赢会发生什么的说法,但我不能完全肯定这是我正在看的正确的代码。
我已经更新了示例以更好地测试和说明我的观点和问题。这显示了代码所说的工作。

我真正追求的是它是否可能仍然是可能实现我在我没想到的一些其它方式的目标。

+1

可能文档是错的或太旧。文档可以说任何作者想要的。如果守则说这是不可能的,那么它实际上是不可能的。对不起。 – RicoBrassers

+0

我知道代码是重要的,但我并不完全确定这是我正在查看的正确代码。也就是说,我所做的例子表明事情要按照代码说的去工作,但仍然有可能以其他方式实现我的目标,但我还没有想到。 – Flygenring

回答

3

使用$mdPanel代替$mdDialog我能达到预期的效果;我分叉我的demo以反映这些变化 - 这些是亮点:

var dialog = {}; 

function showDialogs() { 
    showDialog("one"); 
    showDialog("two"); 
} 

function showDialog(id) { 
    var config = {...}; 

    $mdPanel.open(config) 
     .then(function(panelRef) { 
      dialog[id] = panelRef; 
     }); 
} 

function closeDialogs() { 
    var id; 

    for(id in dialog) { 
     closeDialogSpecific(id, "Closed all for a reason"); 
    } 
} 

function closeDialogSpecific(id, reason) { 
    var message = reason || "finished: " + id; 

    if(!dialog.hasOwnProperty(id) || !angular.isObject(dialog[id])) { 
     return; 
    } 

    if(dialog[id] && dialog[id].close) { 
     dialog[id].close() 
      .then(function() { 
       vm.feedback = message; 
      }); 
     dialog[id] = undefined; 
    } 
} 
2

我建议有两个或两个以上的对话了,同时不理想,可能不推荐使用由谷歌设计的材料。

要从docs

使用对话框谨慎报价,因为他们是中断的。

你说:

当AJAX请求完成读取数据,我想我的 正在加载的旋转关闭,但没有任何错误对话框,可以抓取的 结果。

我在这里的解决方案将有一个对话框,最初显示微调。请求完成后,用任何消息替换微调器。

+0

我同意不应该有太多的对话框,并且它们被构建为在框架中堆叠,所以在一定程度上可以。我这样做的原因是告知用户错误会中断他们的工作,并且(如特别要求的)在加载数据时阻止所有交互(即保存长表单),以便用户知道事情正在发生但在此期间不能混乱。 – Flygenring

+0

@Flygenring你确定你不能用一个对话完成所有的事情吗? :-) –

+0

虽然我可能能够做到,但是需要对整个系统进行重构,因为错误处理(包括对话框)是通过挂钩到内置的异常处理来集中处理的,并且直接对特定操作应用加载。但建议非常感谢! :-) – Flygenring

相关问题