Angular UI Modal 打开的承诺在显示模态之前解决

Posted

技术标签:

【中文标题】Angular UI Modal 打开的承诺在显示模态之前解决【英文标题】:Angular UI Modal opened promise is resolved before modal is shown 【发布时间】:2014-06-27 21:08:23 【问题描述】:

我正在尝试在打开的模式上执行一个 jQuery 脚本,以便将其中一个字段转换为 jQuery UI Spinner

我正在使用Angular UI 中记录的opened 承诺。

问题: jQuery 选择器没有按预期工作,并且不检索任何内容。

所以我的控制器的功能之一是这样的:

var modalInstance = $modal.open(
    templateUrl: 'modalDialog.html',
    controller: modalCtrl,
    resolve: 
        noOfItems: function()
            return $scope.noOfItems;
        
    
);

modalInstance.opened
    .then(function () 
        $(".spinner").spinner(
            max: 20,
            min: 1
        );
    );

modalInstance.result
    .then(function () 
        console.log("modal closed");
    );

还有我的 HTML:

<script type="text/ng-template" id="modalDialog.html">
    <div class="modal-header">
        <h4 class="modal-title">My Modal</h4>
    </div>
    <div class="modal-body">
        <input class="form-control spinner" type="text" ng-model="noOfItems" />
    </div>
    <div class="modal-footer">
        <button class="btn btn-default" ng-click="cancel()">Cancel</button>
        <button class="btn btn-primary" ng-click="save()">Save</button>
    </div>
</script>

modalCtrl 无关紧要。

提示: 我尝试在调用opened 承诺时将debugger 放在正确的位置,发现模态尚未打开。

仅供参考,我正在使用 jQuery 1.9.0、jQuery UI 1.10.4、AngularJS 1.2.16 和 Angular UI Bootstrap v0.11。

【问题讨论】:

【参考方案1】:

您从错误的角度处理问题,试图从控制器进行低级 DOM 操作。这在 AngularJS 世界中是一个很大的禁忌,你会在路上遇到各种各样的麻烦。

您的 UI 逻辑不应“等待”将给定 DOM 节点添加到 DOM 树中,而应以声明方式表示。在这种特殊情况下,这意味着您应该编写一个“滑块”指令,就像这样简单:

yourModule.directive('mySpinner', function() 
  return 
    link: function(scope, elm) 
      elm.spinner(
        max: 20,
        min: 1
      );
    
  ;
);

然后在模态的 HTML 内使用这个新定义的指令:

<input class="form-control spinner" type="text" my-spinner ng-model="noOfItems"/>

这样,当模态的内容被添加到 DOM 时,您无需担心并且您已经使自己喜欢使用可重用的方式来定义微调器!

回到与 $modal 相关的问题 - 当所有数据准备好并且模式即将显示(动画开始等)以能够显示等待指示符或类似内容时,opened 承诺已解决。绝不像 AngularJS 那样,它被设计为知道模态的内容何时被插入到 DOM 树中。大部分时间并不真正需要这种知识。

【讨论】:

谢谢,我是 AngularJS 的新手,有时需要提醒一下它的最佳实践。

以上是关于Angular UI Modal 打开的承诺在显示模态之前解决的主要内容,如果未能解决你的问题,请参考以下文章

如何从任何地方关闭 Angular UI Modal

angular-ui-bootstrap-modal必须要说的几个点(转)

使用 angular-ui-router 和 bootstrap $modal 创建一个多步骤向导

如何检测在 $modal 中关闭模式窗口?角度-ui

如何在 Angular 1.5 组件中等待来自 UI Router Resolve 的承诺

Angular ui bootstrap - 无法注入解析功能