Javascript 实例化并注入AngularJS控制器
我想对多个非常相似的视图使用基本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
资源
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
属性: