【问题标题】:Show pop-ups the most elegant way以最优雅的方式显示弹窗
【发布时间】:2013-03-26 14:04:03
【问题描述】:

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

现在我需要在特定条件成立时显示不同的弹出窗口,我想知道最好的方法是什么。

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


选项 1

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

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


选项 2

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

这个选项不是真正可扩展的。


所以我很确定必须有更好的方法来实现我想要的。

【问题讨论】:

标签: javascript model-view-controller angularjs popup show-hide


【解决方案1】:

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

归根结底,就是将特定的代码放在服务中,而不是控制器中。

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

整个视频也很有趣:-)

【讨论】:

  • Misko 是 Angular 的种子! (哇哈哈)。说真的。将他的话视为角度的权威来源。
【解决方案2】:

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

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

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

【讨论】:

  • $dialog 现在是 $modal
  • @pkozlowski.opensource 我喜欢 ui-bootstrap 的方法,但是我似乎无法将内容与模态进行嵌入。我研究了一些,发现其他人也有这个问题。
  • 顺便提一下,服务不应该访问 DOM。一个指令就是这个地方。
  • @superluminary 这确实是一个很好的一般规则,但知道为什么某个规则正在同步并理解这样的规则何时可以(或甚至应该!)被打破。我相信模态/工具提示等是规则的例外。简而言之:需要了解规则,但也需要了解这些规则适用/不适用的上下文。
【解决方案3】:
  • 创建一个“弹出”指令并将其应用于弹出内容的容器
  • 在指令中,将内容包装在绝对位置 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'。也不是scope.watch(showPopup, function(newVal, oldVal){中的'popup'而不是'showPopup'吗?
【解决方案4】:

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

【讨论】:

  • angular-bootstrap 0.6 以后已将 $dialog 替换为 $modal。这意味着您需要更改所有使用 $dialog 的代码,因为它已被弃用,并将其写入 $modal
【解决方案5】:

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

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

【讨论】:

  • 我只是用这种方法做了一个快速的冲刺,只是意识到这对于单一的弹出/模态方法非常有用,但是想想这个特殊的用户体验:假设客户正在订购商品,用户界面显示一个确认订单弹出窗口(所以我们已经“占用”了亚当的内容弹出窗口)。现在我们单击发送或购买或来自该弹出窗口的任何内容,并且出现错误,用户需要在前一个屏幕中修改该订单。我想在顶层的另一个弹出窗口中显示该错误。我不相信这种方法不会促进这一点。
  • 没错,但我认为不止一个弹出窗口可能是糟糕的 UI。
  • 这个插件就是我一直在寻找的答案!
猜你喜欢
  • 2010-11-25
  • 2010-10-12
  • 2013-04-23
  • 2016-04-16
  • 2014-02-03
  • 2011-08-17
  • 2018-04-01
  • 2015-11-19
  • 2018-05-04
相关资源
最近更新 更多