将服务动态注入控制器

Dynamically inject service to a controller

本文关键字:控制器 注入 动态 服务      更新时间:2023-09-26

而不是指定控制器中的所有服务,例如:

mainApp.controller('MultiController', ['$scope', '$attrs', '$branchesService', '$repositoriesService', function ($scope, $attrs, $branchesService, $repositoriesService) {
console.log('multiController instantiated');
var vm = this;
// private idu funkcija definition bez scope
vm.init = function(mod) {
    vm.mod = mod;
    if (mod == "branch") {
        console.log('MultiController branchesService');
        vm.service = $branchesService;
    } else {
        console.log('MultiController repoService');
        vm.service = $repositoriesService;
    }
    vm.items = [];
    vm.selectedItem = null;
    vm.error = 'no Error at the moment...';
    loadRemoteData();
    console.log('multiController.init()');
}
vm.init($attrs.mod);

可以使用$inject吗?我正在使用$attrs从html获取规范,我应该使用哪种服务。

您可以在控制器中$injector依赖项,然后执行$injector.get来获取服务对象。

$injector用于检索提供程序定义的对象实例, 实例化类型、调用方法和加载模块。

基本上$injector.get方法将搜索您在 angular context 中提供的任何服务名称,如果找到,则返回object

法典

vm.init = function(mod) {
    vm.mod = mod;
    if (mod == "branch") {
        console.log('MultiController branchesService');
        vm.service = $injector.get('branchesService'); //you will have service instance here
    } else {
        console.log('MultiController repoService');
        vm.service = $injector.get('repositoriesService'); //you will have service instance here
    }
    vm.items = [];
    vm.selectedItem = null;
    vm.error = 'no Error at the moment...';
    loadRemoteData();
    console.log('multiController.init()');
}

是的,您可以注入$injector ,并像这样使用它:

var brancesService = $injector.get('brancesService');