$ uibModalInstance undefined(AngularJS UI.Bootstrap)

时间:2015-11-17 19:34:36

标签: angularjs modal-dialog angular-ui-bootstrap

为什么$ uibModalInstance无法在这里注入?

http://plnkr.co/edit/mi9Ytv0HaqE47ENod4Gn?p=preview

baseController.$inject = ['$uibModal', '$uibModalInstance'];

function baseController($uibModal, $uibModalInstance) {

self.ok = function () {
$uibModalInstance.close(self.selected.item);
};

self.cancel = function () {
$uibModalInstance.dismiss('cancel');
};

我正在尝试访问$ uibModalInstance,如果我尝试注入它,我会收到注入错误。

如果我不注射它,那么它是未定义的......

3 个答案:

答案 0 :(得分:3)

这里有很多很好的陈述,但没有一个能够解决这个问题。

amg-argh 让我的plkr以我设置注射的方式工作

http://plnkr.co/edit/GXXmUosUEnEO3Tk0gUyp?p=preview

最大的魔力来自于此编辑......

var childController = function ($scope, $uibModalInstance) {
        $scope.ok = function () {
            $uibModalInstance.close({ my: 'data' });
        }
        $scope.cancel = function () {                
            $uibModalInstance.dismiss();
        }
    }

    self.open = function (size) {

        var modalInstance = $uibModal.open({
            animation: self.animationsEnabled,
            templateUrl: 'help.html',
            controller: childController,
            size: size
        });
    };

+++++++++++++++++++++++++++++

我还要注意,这应该是稍后作为服务完成的,就像 icfantv 指出的那样。但我需要弄清楚返回和使用模态的承诺的语法......

谢谢大家的帮助!!

干杯!

答案 1 :(得分:1)

我怀疑你的代码失败的原因是因为你试图将模态实例注入控制器,而控制器负责创建模态。它不能注入它,因为它还不存在。尝试使用单独的控制器:一个用于打开模态,另一个用于处理模态内容。您可以在our modal example的Javascript部分中看到此示例。

TBH,我以前从未见过以这种方式注入依赖关系。这样做有什么问题吗?您不仅仅使用的任何理由:

{{1}}

答案 2 :(得分:1)

你的插件示例有一些问题:

加载脚本的顺序很重要,您有:

<script data-require="angular.js@1.4.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js" data-semver="1.4.7"></script>
<script src="app.module.js"></script>
<script src="childController.js"></script>
<script src="baseController.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular-animate.js"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.14.3.js"></script>

这不起作用,因为app.module.js依赖于angular-ui-bootstrap.js而childController.js依赖于angular-animate.js而childController.js依赖于baseController.js你需要加载脚本以下顺序:

<script data-require="angular.js@1.4.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js" data-semver="1.4.7"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular-animate.js"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.14.3.js"></script>
<script src="app.module.js"></script>
<script src="baseController.js"></script>
<script src="childController.js"></script>

在childcontroller.js中,你有:

angular
      .module('app', ['ngAnimate'])

正在重新创建并覆盖“应用”。在app.module.js中创建。您应该在app.module.js中注入ngAnimate模块,如下所示:

angular
    .module('app', ['ngAnimate', 'ui.bootstrap']); 

您不需要在基本控制器中引用$ uibModalInstance:

var modalInstance = $uibModal.open({
  animation: self.animationsEnabled,
  templateUrl: 'help.html',
  controller: 'BaseController',
  size: size
});

可让您访问通过&var; var modalInstance&#39;打开的模式。有接近和解雇的方法。