【问题标题】:How to close an Angular-ui-bootstrap uibModal on mouseleave using Factory?如何使用Factory在mouseleave上关闭Angular-ui-bootstrap uibModal?
【发布时间】:2017-05-11 02:08:42
【问题描述】:

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

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

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

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

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

我的问题是如何从我的 tagsPanel 组件调用 TagHoverController 中的关闭功能或 $uibModal 上的 close -> TagsHover Factory? (不使用 $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;

这里是文档https://angular-ui.github.io/bootstrap/#/modal

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

close(result) (Type: function) - 可以用来关闭一个模态,传递一个结果。

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

【问题讨论】:

  • 使用 $uibModalInstance.close() 代替 $uibModal.close()
  • 嗯,我刚试过...我注入了$uibModalInstance,但得到了未知的提供者:(

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


【解决方案1】:

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

  1. $uibModalStack.dismissAll(); // dismiss all opened modal
  2. $uibModalStack.dismiss(openedModal.key); // dismiss modal by key

dismiss 方法示例。

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 注入相同。

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

【讨论】:

  • 谢谢,但我不是想从 Modal 关闭,而是从设置它的工厂关闭。如果我在 Modal 的范围内,我可以调用 this.cancel。
  • 明白了。你需要使用 $uibModalStack ,因为它的工厂有详细的例子
  • 实际上我现在需要重新审视这个......我必须能够针对打开的特定模式,而不是所有模式。在您的示例中,repaymentPercentage 来自哪里?
  • 您能否使用我上面的function factory($uibModal) 示例发布另一个代码示例?我试图弄清楚如何设置模态键以及通过openedModal.key 调用某些东西
  • 添加$uibModalStack.dismiss的示例
【解决方案2】:

这是错误的方法——你不能“只关闭模态”,因为你不知道要关闭哪个模态。我建议你重新设计这个...

您可以查看$uibModalStack - 它存储打开的模式并具有dismisAll 之类的方法

【讨论】:

  • 不错!这是有效的,我在$uibModalStack 上没有看到任何文档,你有链接吗?
  • 这可能是解决方案,我在这里找到了更多信息:stackoverflow.com/questions/25445949/…
【解决方案3】:

我使用 close() 方法和 $uibModal 和 open() 方法在 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();

【讨论】:

    【解决方案4】:

    执行此操作时,我将模态设置为范围变量,然后使用 $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);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2015-10-24
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多