Angular UI Bootstrap 型号:[$injector:unpr] 未知提供者:$uibModalInstance 提供者

Angular UI Bootstrap Modal: [$injector:unpr] Unknown provider: $uibModalInstanceProvider

这有点奇怪。当我在网上搜索这个问题时,我看到很多页的 Google 结果和 SO 解决方案......但是 none 似乎有效!

简而言之,我正在尝试实现 AngularUI Bootstrap 模式。我不断收到以下错误:

Error: [$injector:unpr] Unknown provider: $uibModalInstanceProvider <- $uibModalInstance <- addEntryCtrl

这是我的 HTML:

<nav class="navbar navbar-default">
  <div class="container">
    <span class="nav-col" ng-controller="navCtrl" style="text-align:right">
      <a class="btn pill" ng-click="open()" aria-hidden="true">Add New</a>
    </span>
  </div>
</nav>

这是我的控制器:

var app = angular.module('nav', ['ui.bootstrap']);

app.controller('navCtrl', ['$scope', '$uibModal', function($scope, $uibModal) {
  $scope.open = function() {
    var uibModalInstance = $uibModal.open({
      animation: true,
      templateUrl: 'addEntry/addEntry.html',
      controller: 'addEntryCtrl',
    });
  };
}]);

最后,这是我的模态代码:

var app = angular.module('addEntry', ['firebase', 'ui.bootstrap']);

app.controller('addEntryCtrl', ['$scope', '$firebaseObject', '$state', '$uibModalInstance', function($scope, $firebaseObject, $state, $uibModalInstance) {
  $scope.cancel = function() {
    $uibModalInstance.dismiss('cancel');
  };

  $uibModalInstance.close();
}]);

我尝试过的解决方案:

有什么想法吗?这已经让我难受了将近 2 天了。

* 编辑 *

我应该注意两件事:

1) 当我从 addEntry 中删除 $uibModalInstance 作为依赖项时,我的 HTML 表单提交按钮工作正常并且表单看起来很完美。即使重定向正确发生(在提交时)。问题仍然存在:模态框仍然停留在屏幕上,并抛出 $uibModalInstance 未定义的错误。这是有道理的,因为我将它作为依赖项删除了,但我显然仍然需要模态在提交时关闭。

2) 此外,我在应用程序的另一部分使用了几乎相同的代码。唯一的区别是它是通过工厂工作的。否则,代码是相同的。因此,我相信我的依赖项都在那里并且版本是正确的。所以。该死的。奇怪。

谢谢!

您正在尝试引用属于单独模块的控制器。为了让它工作,你需要将你的辅助模块(addEntry)注入你的主模块(nav):

var app = angular.module('nav', ['ui.bootstrap', 'addEntry']);

已找到答案!在和我的朋友一起砍掉之后,我们找到了答案。我想 post 放在这里,以防其他人看到。

事实证明,我们的模态 window 中有一个 ng-controller,它位于 div 标记中,它包裹了模态中的整个 html 表单。以前,当我们的表单不在模态中时(它有一个单独的 URL),这工作正常,但由于某种原因,当它在模态中时它会中断。 ng-controller 正在引用 addEntryCtrl。删除它后,表单立即生效!

问题是您在 2 个地方指定了一个(或两个)控制器——当打开模式时和在模板内——这是不需要的。 从模板中删除 ng-controller 一切都会像 expected.Trust 我一样工作,它会工作。

事实证明,如果您在 html 模板(使用 ng-controller="...")中指定控制器,它不会解析 $uibModalInstance。从对 $uibModal.open({controller="...", ...}) 的调用中指定控制器将允许它正确解析。

由于您只需要 dismiss()close() 方法,您可以从 $scope(名为 $dismiss$close)获取它们,因为这将以两种实例化控制器的方式正确解析。

var app = angular.module('addEntry', ['ui.bootstrap']);
app.controller('addEntryCtrl', ['$scope', function($scope) {
    $scope.cancel = function() {
        $scope.$dismiss('cancel');
    };

    $scope.$close();
}]);

当您使用 $uibModal.open()(见下文)并明确指定 controller 名称时,您不应将指令 ng -controller 在模板中。 那导致错误。在 View 中没有 ng-controller

 var uibModalInstance = $uibModal.open({
  animation: true,
  templateUrl: 'addEntry/addEntry.html',
  controller: 'addEntryCtrl',
});