我有这两种观点:
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
作为普通视图(通过$routeProvider
和ng-view
指令)调用时,它会抛出错误,即:
.when('/foo', {
templateUrl: 'foo.html',
controller: 'fooController'
})
错误是:
Error: [$injector:unpr] Unknown provider: $uibModalInstanceProvider <- $uibModalInstance <- fooController
视图不显示“John”(因为错误)
我该如何解决这个问题?我真的需要重用foo.html
和fooController
作为模态和非模态,因为它们有很多东西(我在这里简化了)
编辑: 这是一个傻瓜:
{{3}}
答案 0 :(得分:9)
我解决了这个问题:
$uibModalInstance
fooController
调用模态时,我将modalInstance作为变量传递给模态的范围:
var modalScope = $scope.$new();
var modalInstance = $uibModal.open({
templateUrl: 'foo-as-modal.html',
controller: 'fooController',
scope: modalScope
});
modalScope.modalInstance = modalInstance;
使用范围变量:
关闭模态$scope.modalInstance.dismiss('cancel'); // instead of $uibModalInstance.dismiss(..)
这是原始plunkr的一个分支,使用此解决方案:https://plnkr.co/edit/ZasHQhl6M5cCc9yaZTd5
答案 1 :(得分:3)
您不能将同一个控制器用于页面视图和模态窗口。至少,直到控制器依赖于$uibModalInstance
。
$uibModalInstance
只能以模态注入。
答案 2 :(得分:0)
执行此操作的一种方法是使用null(或空字符串/或任何您喜欢的内容)解析路由中的$uibModalInstance
并将其注入控制器。如果html页面未作为模式打开,您仍然拥有$uibModalInstance
。如果它作为模态打开,则$uibModalInstance
会自动注入。