如何使用Factory关闭mouseleave上的Angular-ui-bootstrap uibModal?

时间:2016-12-26 17:02:17

标签: javascript angularjs angular-ui-bootstrap angular-ui angularjs-service

我最近在我们的应用程序中将所有模态指令切换到Angular-ui-Bootstrap模式。好多了,但是遇到了一种新的模式,它在鼠标上关闭而不是取消点击。

this.leaveTag = (tag) => {
    TagHover.off();
};

this.hoverTag = (tag) => {
    TagHover.display();
};

上面是调用TagHover Factory内部函数的视图逻辑。

下面是Factory,TagHover.display与我们的其他模态一样正常,但我正在尝试用leaveTag > TagHover.off调用modal.close。到目前为止还没有工作。

我的问题是如何在TagHoverController中调用close函数,或者在我的tagsPanel组件中调用$ uibModal上的close - > TagsHover工厂? (不使用$ scope或$ rootScope事件)

我不是要尝试从TagHover Ctrl范围内调用close/cancel,而是尝试从父范围调用close

const TagHover = angular.module('tickertags-shared')
    .controller('TagHoverController', TagHoverController)
    .factory('TagHover', factory);

TagHoverController.$inject = [
    'TagHover'];

function TagHoverController(
    TagHover) {

    this.$onInit = () => {
        console.log('TagHover onInit')
    };

    this.cancel = () => this.$close();
}

factory.$inject = ['$uibModal'];

function factory($uibModal) {

    const display = () => {
        const modal = $uibModal.open({
            controllerAs: 'tghov',
            bindToController:true,
            templateUrl: 'tags/tag_hover.html',
            windowClass: 'dash-modal',
            resolve: {},
            controller: 'TagHoverController'
        });
    };

    const off = () => {
        $uibModal.close({});
    };

    return {
        display,
        off
    }
}

module.exports = TagHover;

enter image description here

以下是文档https://angular-ui.github.io/bootstrap/#/modal

  

open方法返回一个模态实例,一个具有以下属性的对象:

     

close(result)(类型:function) - 可用于关闭模态,传递结果。

我还注销了$uibModal对象,我只看到一个打开的函数,没有关闭:(

enter image description here

4 个答案:

答案 0 :(得分:9)

在您的情况下,您正在使用Factory进行动态模态。所以你可以用以下两种方式使用$uibModalStack

  1. $uibModalStack.dismissAll(); // dismiss all opened modal
  2. $uibModalStack.dismiss(openedModal.key); // dismiss modal by key
  3. 解雇方法的例子。

    var top = $uibModalStack.getTop();
    if (top) {
        $uibModalStack.dismiss(top.key);
    }
    
      

    在路由器更改期间从动态模态中解除模态非常重要。

    一般来说,$uibModal将有助于打开模态,然后每个模态都是$uibModalInstance,如果你想在模态中关闭模态。

    在活动中打开模式

    angular.module('myPage')
      .controller('PageController', ['$uibModal',
        function($uibModal) {
          function onModalLink() {
            $uibModal.open({
              templateUrl: 'app/modals/paymentTpl.html',
              controller: 'PaymentModalController as vm',
              windowClass: 'generalModal myModal'
            });
          }
        }
      ]);
    

    从实例关闭。

    angular.module('paymentModal')
      .controller('PaymentModalController', [
        '$uibModalInstance',
        function ChangeRepaymentController($uibModalInstance) {
          function onCancel() {
            $uibModalInstance.close(repaymentPercentage);
          }
        }
      ]);
    
      

    modalInstance - 模态实例。这与使用控制器时发现的$ uibModalInstance注入相同。

    WIKI参考:https://github.com/angular-ui/bootstrap/tree/master/src/modal/docs

答案 1 :(得分:5)

这是错误的做法 - 你不能"只关闭模态",因为你不知道要关闭哪个模态。我建议你重新设计一下......

您可以查看$uibModalStack - 它会存储已打开的模态并使用dismisAll等方法

答案 2 :(得分:3)

我使用带有$ uibModal和open()方法的close()方法来管理AngularJS $ uiModal

打开方法

vm.lanzarPopShowTask = lanzarPopShowTask;
function lanzarPopShowTask(index){
    vm.modalInstance = $uibModal.open({
        animation: true,
        ariaLabelledBy: 'modal-title-top',
        ariaDescribedBy: 'modal-body-top',
        templateUrl: '/btask/index/task.html',
        size: 'm',
        controller: function ($scope) {
            vm.task = vm.tasks[index];
            vm.index = index;
        },
        scope: $scope
    });
}

并关闭方法

vm.modalInstance.close();

答案 3 :(得分:3)

在执行此操作时,我将模态设置为范围变量,然后使用$scope.sweetModal.close()$scope.sweetModal.dismiss()您必须记住,如果您要执行以下操作,则无法工作:

$scope.openModal = function () {
    $scope.sweetModal = $uibModal.open({
        templateUrl: '/modals/sweetModal.html',
        size: 'md',
        scope: $scope,
        backdrop: true
    })
        .result.then($scope.modalCloseFunction, $scope.modalDismissFunction);
};

由于变量的设置方式,以下内容可行:

$scope.openModal = function () {
    $scope.sweetModal = $uibModal.open({
        templateUrl: '/modals/sweetModal.html',
        size: 'md',
        scope: $scope,
        backdrop: true
    });

    $scope.sweetModal.result.then($scope.modalCloseFunction, $scope.modalDismissFunction);
};