【问题标题】:Angular.ui Modal doesn't close or cancelAngular.ui 模态不会关闭或取消
【发布时间】:2016-11-20 13:35:09
【问题描述】:

我找不到为这个问题命名的方法,所以如果您能提出更好的方法,请告诉我。无论如何,关于我的问题。

当用户想要注销时,我正在实现一个模式。用户单击注销图标。该图标在我的控制器中使用注销功能调用模式,如下所示:

<li ng-controller="modalController">
     <a href="" class="mb-control" ng-click="logout();" ><span class="fa fa-sign-out"></span></a>
</li>

我的 modalController 看起来像这样

app.controller('modalController', ['$scope', '$location', '$uibModal', '$log', function($scope, $location, $uibModal, $log, $uibModalInstance) {
    $scope.logout = function(){
        $uibModal.open({
            templateUrl: 'views/partials/logoutMsg.html'
        });

        $scope.ok = function () {
            $uibModalInstance.close();
            $location.path('/login');
        };

        $scope.cancel = function () {
            $uibModalInstance.dismiss();
        };
    };
}]);

我的模态模板里面有这个:

<div class="mb-container">
    <div class="mb-middle">
        <div class="mb-title"><span class="fa fa-sign-out"></span> Log <strong>Out</strong> ?</div>
        <div class="mb-content">
            <p>Are you sure you want to log out?</p>
            <p>Press No if you want to continue work. Press Yes to logout current user.</p>
        </div>
        <div class="mb-footer">
            <div class="pull-right">
                <button class="btn btn-primary mb-control-close" ng-click="cancel()">No</button>
                <button ng-click="ok()" class="btn btn-success">Yes</a>
            </div>
        </div>
    </div>
</div>

附言我在 index.html 中对 Angular 引导程序和控制器的引用调用已签出。我也将 ui.bootstrap 包含在我的 angular.module 中。实际上,我的控制台中没有任何错误表明任何缺少依赖项或错误注入。

问题

  1. 模式确实打开了,但是当我单击按钮或在模式区域之外时它不会关闭。我不仅希望它消失,而且Yes 按钮应该重定向到 /login 页面并且模式消失。 No 按钮只是关闭模式。在模态区域外单击也会关闭模态。

  2. 当我单击注销图标时,模式会一遍又一遍地打开。打开它很棒,但是一次就足够了,谢谢你lol

【问题讨论】:

    标签: angularjs angular-ui-bootstrap


    【解决方案1】:

    您的代码中有几处不起作用。

    让我们从最重要的事情开始:为什么模式没有关闭?

    您的 okcancel 方法已分配给 modalController 范围,但您没有将任何范围传递给您的模式,因此它使用 $rootScope 并且它没有 ok 和 @987654328 @ 方法。要解决此问题,您必须将范围传递给 $uibModal.open 方法,因此它应该如下所示:

    $uibModal.open({
        templateUrl: 'views/partials/logoutMsg.html',
        scope: $scope //using modalController scope
     });
    

    但这并不能解决问题。在okcancel 中,您指的是$uibModalInstance,但它是undefined。您可能认为将其注入控制器即可解决问题,但事实并非如此。它无法注入 - 如果您将其注入模态中的控制器,因此要解决此问题,您需要将 $uibModal.open 的结果分配给变量。

    var $uibModalInstance = $uibModal.open();
    

    这是可行的解决方案

    https://jsfiddle.net/zho5k7af/

    但是我会在模态中添加一个控制器,这样你就不会污染$scope。请参阅我的解决方案。

    https://jsfiddle.net/3dhubhrm/1/

    【讨论】:

    • 优秀的解决方案!谢谢! Angular 还很年轻,除了基本的东西之外,真的没有太多的帮助。关于如何阻止图标在已经打开后调用模式的任何想法?它没有发生在你的小提琴中,但它正在发生在我身上
    • 好的,我发现要阻止后台产生更多的模态调用,必须通过在函数中添加'modal: true'来禁用它。并确保没有项目的 z-index 高于模态的,尤其是带有负责进行模态调用的图标的项目。
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多