将$ uibModalInstance注入不由$ uibModal启动的控制器

时间:2016-06-11 19:20:26

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

我有这两种观点:

1)foo.html

  <p>Hello {{name}}</p>

2)foo-as-modal.html

<div class="modal-header">
    <h3 class="modal-title">I'm a modal</h3>
</div>
<div class="modal-body">
    <ng-include src="'foo.html'"></ng-include>
</div>
<div class="modal-footer">
    <button class="btn btn-default" ng-click="cancel()">Close</button>
</div>

foo.html的控制器是fooController

angular.module('myApp').controller('fooController', ['$scope','$uibModalInstance', function($scope,$uibModalInstance) {

     $scope.name = "John"

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

我需要$uibModalInstance注入fooController .dismiss才能工作

当我将foo-as-modal.html作为模态调用时,这很有效,即:

    var modalInstance = $uibModal.open({
        templateUrl: 'foo-as-modal.html',
        controller: 'fooController',
        scope: $scope.$new(),
        size: 'lg'
    });

但是当我将foo.html作为普通视图(通过$routeProviderng-view指令)调用时,它会抛出错误,即:

    .when('/foo', {
        templateUrl: 'foo.html',
        controller: 'fooController'
    })

错误是:

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

视图不显示“John”(因为错误)

我该如何解决这个问题?我真的需要重用foo.htmlfooController作为模态和非模态,因为它们有很多东西(我在这里简化了)

编辑: 这是一个傻瓜:

{{3}}

3 个答案:

答案 0 :(得分:9)

我解决了这个问题:

  1. $uibModalInstance
  2. 中移除了注射fooController
  3. 调用模态时,我将modalInstance作为变量传递给模态的范围:

    var modalScope = $scope.$new();
    
    var modalInstance = $uibModal.open({
        templateUrl: 'foo-as-modal.html',
        controller: 'fooController',
        scope: modalScope
    });
    
    modalScope.modalInstance = modalInstance;
    
  4. 使用范围变量:

    关闭模态
    $scope.modalInstance.dismiss('cancel');  // instead of $uibModalInstance.dismiss(..)
    
  5. 这是原始plunkr的一个分支,使用此解决方案:https://plnkr.co/edit/ZasHQhl6M5cCc9yaZTd5

答案 1 :(得分:3)

您不能将同一个控制器用于页面视图和模态窗口。至少,直到控制器依赖于$uibModalInstance

$uibModalInstance只能以模态注入。

答案 2 :(得分:0)

执行此操作的一种方法是使用null(或空字符串/或任何您喜欢的内容)解析路由中的$uibModalInstance并将其注入控制器。如果html页面未作为模式打开,您仍然拥有$uibModalInstance。如果它作为模态打开,则$uibModalInstance会自动注入。