以最优雅的方式显示弹出窗口


178

我有这个AngularJS应用。一切正常。

现在,当满足特定条件时,我需要显示不同的弹出窗口,我想知道什么是最好的处理方式。

目前,我正在评估两个选项,但是我绝对会接受其他选项。


选项1

我可以为弹出窗口创建新的HTML元素,然后直接从控制器附加到DOM。

这将打破MVC设计模式。我对这种解决方案不满意。


选项2

我总是可以在静态HTML文件中插入所有弹出窗口的代码。然后,使用ngShow,我可以仅隐藏/显示正确的弹出窗口。

此选项不是真正可扩展的。


因此,我很确定必须有一种更好的方法来实现我想要的目标。


多种方式,用于html的控制器绝对不是一种好的方式,请看UI Bootstrap Modal angular-ui.github.com/bootstrap/#/modal
charlietfl 2013年

1
AngularJS的文档在“ 了解转义和作用域 ”部分下解释了如何管理弹出窗口。希望这可以帮助。
伊万·费雷尔别墅

如果您真的想扩展弹出窗口,请查看popscript
Raj Nathani 2014年

Answers:


88

根据到目前为止我对AngularJS模态的经验,我认为最优雅的方法是专用的服务,我们可以为它提供部分(HTML)模板,以模态显示。

当我们考虑它时,模态是AngularJS路线的一种,但只显示在模态弹出窗口中。

AngularUI引导程序项目(http://angular-ui.github.com/bootstrap/)具有出色的$modal服务(在版本0.6.0之前称为$ dialog),该服务的实现是将部分内容显示为模态弹出窗口。


10
$ dialog现在是$ modal
Sangram Singh

1
@ pkozlowski.opensource我喜欢ui-bootstrap的方法,但是我似乎无法使用模式来包含内容。我已经对其进行了一些研究,看到其他人也遇到了这个问题。
jusopi 2014年


仅需提及,服务不应访问DOM。指令就是这样做的地方。
superluminary 2014年

1
@superluminary的确是遵循的一个很好的一般规则,但是知道为什么要遵循某条规则并理解何时可以(甚至应该!)打破该规则也是上帝。我相信模式/工具提示之类的规则是例外。简而言之:既需要了解规则,又要了解规则适用/不适用的背景。
pkozlowski.opensource

29

这很有趣,因为我自己正在学习Angular,并且正在YouTube上观看他们频道中的一些视频。演讲者在这段视频中提到您的确切问题https://www.youtube.com/watch?v=ZhfUv0spHCY#t=1681在28:30分钟左右。

归结为将特定的代码段放置在服务而不是控制器中。

我的猜测是将新的弹出元素注入DOM并单独处理它们,而不是显示和隐藏相同的元素。这样,您可以拥有多个弹出窗口。

整个视频也非常有趣:-)


2
Misko是Angle的种子!(bwa哈哈)。认真。把他的话是的角度权威来源。
2013年

14
  • 创建一个“ popup”指令并将其应用于弹出内容的容器
  • 在指令中,将内容及其下的掩码div包裹在绝对位置div中。
  • 可以根据需要从指令内在DOM树中移动2个div。指令中的任何UI代码都可以,包括将弹出窗口置于屏幕中央的代码。
  • 创建一个布尔标志并将其绑定到控制器。该标志将控制可见性。
  • 创建绑定到OK / Cancel函数等的范围变量。

编辑以添加高级示例(无功能)

<div id='popup1-content' popup='showPopup1'>
  ....
  ....
</div>


<div id='popup2-content' popup='showPopup2'>
  ....
  ....
</div>



.directive('popup', function() {
  var p = {
      link : function(scope, iElement, iAttrs){
           //code to wrap the div (iElement) with a abs pos div (parentDiv)
          // code to add a mask layer div behind 
          // if the parent is already there, then skip adding it again.
         //use jquery ui to make it dragable etc.
          scope.watch(showPopup, function(newVal, oldVal){
               if(newVal === true){
                   $(parentDiv).show();
                 } 
              else{
                 $(parentDiv).hide();
                }
          });
      }


   }
  return p;
});

$ watch而不是'watch'。也不是'popup'而不是'showPopup' scope.watch(showPopup, function(newVal, oldVal){吗?
Sangram Singh 2013年

14

请参阅 http://adamalbrecht.com/2013/12/12/creating-a-simple-modal-dialog-directive-in-angular-js/, 了解使用Angular进行模态对话框且无需引导的简单方法

编辑:我从那以后一直在使用http://likeastore.github.io/ngDialog中的 ng-dialog,它很灵活,没有任何依赖关系。


1
我只是用这种方法进行了快速冲刺,只是意识到这对于单个弹出/模态方法非常有用,但是请考虑一下这种特定的用户体验:假设客户正在订购商品,并且UI会显示确认订单弹出窗口(所以我们“已经”占领了亚当的弹出式窗口,并显示了相应内容)。现在,我们单击“发送”或“购买”或该弹出窗口中的任何内容,并且出现一个错误,用户需要在前一个屏幕中修改该订单。我想在另一个弹出窗口中显示该错误。我不相信这种方法不会带来任何好处。
jusopi 2014年

3
没错,但我认为一个不良的UI可能不止一个弹出窗口。
Nik Dow

好了,插件就是我一直在寻找的答案!
安德烈斯·菲利普

7

Angular-ui带有对话框指令,使用它并将模板URL设置为要包含的任何页面,这是最优雅的方式,我也在我的项目中使用过它。您可以根据需要为对话框传递其他几个参数。


5
angular-bootstrap 0.6及更高版本已将$ dialog替换为$ modal。这意味着你需要改变正在使用$对话框,因为它已被弃用所有代码和它在$模式写
穆罕默德汗Umair
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.