ChatGPT解决这个技术问题 Extra ChatGPT

以最优雅的方式显示弹窗

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

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

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

选项1

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

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

选项 2

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

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

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

方法很多,html 控制器肯定不是好方法,看看 UI Bootstrap Modal angular-ui.github.com/bootstrap/#/modal
AngularJS 的文档在“Understanding Transclusion and Scopes”部分解释了如何管理弹出窗口。希望这可以帮助。
如果您真的想通过弹出窗口进行扩展,请查看 popscript

s
skeletank

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

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

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


$dialog 现在是 $modal
@pkozlowski.opensource 我喜欢 ui-bootstrap 的方法,但是我似乎无法使用模态嵌入内容。我已经对其进行了一些研究,并看到其他人也有这个问题。
顺便提一下,服务不应该访问 DOM。一个指令就是这个地方。
@superluminary 这确实是一个很好的一般规则,但是知道为什么某条规则正在发展并理解何时可以(甚至应该!)打破这样的规则也是上帝。我相信模式/工具提示等是规则的例外。简而言之:需要了解规则,但也需要了解这些规则适用/不适用的上下文。
J
Jayantha Lal Sirisena

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

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

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

整个视频也很有趣:-)


Misko 是 Angular 的种子! (哇哈哈)。说真的。将他的话视为角度的权威来源。
K
Ketan

创建一个“弹出”指令并将其应用于弹出内容的容器

在指令中,将内容包装在绝对位置的 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' 吗?
N
Nik Dow

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

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


我只是用这种方法做了一个快速冲刺,才意识到这对于单个弹出/模态方法非常有用,但是想想这个特殊的用户体验:假设客户正在订购商品,并且 UI 显示确认订单弹出窗口(所以我们'已经'占领'亚当的弹出内容)。现在我们单击发送或购买或来自该弹出窗口的任何内容,并且出现错误,用户需要在前一个屏幕中修改该订单。我想在顶层的另一个弹出窗口中显示该错误。我不相信这种方法不会促进这一点。
没错,但我认为不止一个弹出窗口可能是糟糕的 UI。
好吧,插件就是我一直在寻找的答案!
u
user2203937

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


angular-bootstrap 0.6 及以后的版本已将 $dialog 替换为 $modal。这意味着您需要更改所有使用 $dialog 的代码,因为它已被弃用,并将其写入 $modal