Javascript 实例化并注入AngularJS控制器

Javascript 实例化并注入AngularJS控制器,javascript,angularjs,angular-ui-bootstrap,Javascript,Angularjs,Angular Ui Bootstrap,我想对多个非常相似的视图使用基本AngularJS控制器,但我想更改传递到每个控制器的资源 coreAppControllers.controller('MachinesEditCtrl', ['$modal', function ($modal) { $modal.open({ backdrop: 'static', keyboard: false, templateUrl: '/pa

我想对多个非常相似的视图使用基本AngularJS控制器,但我想更改传递到每个控制器的
资源

coreAppControllers.controller('MachinesEditCtrl', ['$modal',
    function ($modal) {

        $modal.open({
            backdrop:    'static',
            keyboard:    false,
            templateUrl: '/partials/v1/resources/machines/edit',
            controller:  //ModalEditCtrl with specific Machine resource injected
        });
    }]
);
这是基本控制器:

coreAppControllers.controller('ModalEditCtrl',
    function ($scope, $stateParams, Resource, $state, $modalInstance) {
         // A bunch of methods calling Resource
    }
);
现在我想在另一个控制器中使用此控制器,但使用特定于父控制器的
资源

coreAppControllers.controller('MachinesEditCtrl', ['$modal',
    function ($modal) {

        $modal.open({
            backdrop:    'static',
            keyboard:    false,
            templateUrl: '/partials/v1/resources/machines/edit',
            controller:  //ModalEditCtrl with specific Machine resource injected
        });
    }]
);
在JavaScript中,这可能是错误的方法。在其他语言中,我会扩展基类,但我不确定在原型语言中会是什么


解决方案 感谢PSL提供的答案,但是该方法未能正确注入
$modalInstance
。最终的解决方案是使用resolve属性,让DI来担心其余的问题

出于某种原因,在传递到resolve时,必须将服务包装在匿名函数中


我认为您更关心的是DI方面,您可以通过以下方式轻松完成:-

假设这是您的控制器:-

function ModalEditCtrl($scope, $stateParams, Resource, $state, $modalInstance) {
     // A bunch of methods calling Resource
}
app.controller('ModalEditCtrl',['$scope', '$stateParams', 'Resource', '$state', $modalInstance, ModalEditCtrl]);
只需注册您的特定控制器即可:-

app.controller('ModalEditCtrlParent1',['$scope', '$stateParams', 'OtherResource', '$state', $modalInstance, ModalEditCtrl]);

app.controller('ModalEditCtrlParent2',['$scope', '$stateParams', 'SomeOtherResource', '$state', $modalInstance, ModalEditCtrl]);
在你的模式中,只要做:-

   $modal.open({
        backdrop:    'static',
        keyboard:    false,
        templateUrl: '/partials/v1/resources/machines/edit',
        controller:  'ModalEditCtrlParent1'
    });
通过这种方式,您可以保持控制器的跟随性,任何新视图都只需添加一个新视图,而不必修改现有视图

下面是另一种方法,您可以使用
$controller
服务根据提供的依赖关系获取控制器实例:-

coreAppControllers.controller('MachinesEditCtrl', ['$modal', 'Resource2' function ($modal, Resource) {
        var viewModel = $scope.$new(true);
        $modal.open({
            backdrop:    'static',
            keyboard:    false,
            scope: viewModel,
            templateUrl: '/partials/v1/resources/machines/edit',
            controller: function(){
                 return $controller('ModalEditCtrl', {$scope:viewModel, Resource:Resource});
            } 
        });
    }]
);


你可以使用任何(我使用的),但这取决于你想扩展什么?是作用域($scope)还是控制器(controller As)本身(您基本上是要扩展视图模型)。

如果您只想更改资源,您可以使用Dep injection参数进行更改。例如:
coreAppControllers.controller('ModalEditCtrl1',['$scope','$stateParams','differsource','$state','$modalInstance',ctor])
另一种使用
$controller
选项的方法如果您通过路由器呼叫控制器,您可以查看使用路由器本身的
resolve
属性: