uibModalInstance作为可选服务

时间:2016-02-11 04:35:28

标签: angularjs angular-ui-bootstrap

我的情况需要使用uibModalInstance作为可选的注入器。 因为我需要为两个视图使用相同的控制器。一个是弹出视图,另一个是普通视图。当我使用弹出窗口时,它工作正常。在另一种情况下,它会抛出一个未知的喷油器错误。

任何人都可以帮助解决这个问题。

此致 Kiran Gopal

2 个答案:

答案 0 :(得分:0)

您可以按如下方式将模块有条件地注入控制器。确保您已为该视图包含相关依赖项的javascript:

angular.module('myApp').controller('Controller', 
    ['$injector', '$scope', '$http',
    function($injector, $scope, $http) {
        var uibModalInstance;
        if (view1) {
            uibModalInstance = $injector.get('uibModalInstance');
        }
    });

答案 1 :(得分:0)

我最近不得不解决同样的问题。最后,这有效。

最初,我的代码看起来像这样:

app.controller('PaymentController', ['$injector', 'PaymentService', 
                                     '$scope', '$rootScope', '$uibModalInstance', PaymentConstructor]);

function PaymentConstructor($injector, PaymentService, $scope, $rootScope, $modalInstance) {
    $scope.view = '';
    ...and so on...

..并且要求是在控制器功能中有条件地拥有/不拥有$uibModalInstance

请改用:

app.controller('PaymentController', dependencyInjection);

其中dependencyInjection是上面声明的数组变量:

var dependencyInjection = ['$injector', 'PaymentService', '$scope', '$rootScope']

..现在你可以决定 - 把什么放到数组或什么不放。 e.g:

if (includeUibInstance) dependencyInjection.push('$uibModalInstance');
if (includeUibInstance) {
    dependencyInjection.push(PaymentConstructorWithUib);
} else {
    dependencyInjection.push(PaymentConstructorNoUib);
}

..最后,我们需要声明这两个新的条件函数:

function PaymentConstructorNoUib($injector, PaymentService, $scope, $rootScope) {
    PaymentConstructor($injector, PaymentService, $scope, $rootScope, null);
}

function PaymentConstructorWithUib($injector, PaymentService, $scope, $rootScope, $modalInstance) {
    PaymentConstructor($injector, PaymentService, $scope, $rootScope, $modalInstance);
}

//original controller function:
function PaymentConstructor($injector, PaymentService, $scope, $rootScope, $modalInstance) {
    // if $modalInstance is null then we are not in modal dialog
    $scope.view = '';
    ...

那就是它。测试。像魅力一样。