Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS中控制器内部的动态提供程序_Angularjs_Angularjs Service - Fatal编程技术网

AngularJS中控制器内部的动态提供程序

AngularJS中控制器内部的动态提供程序,angularjs,angularjs-service,Angularjs,Angularjs Service,在配置路由时,我还配置了设置,这是一个带有静态值的对象的自定义属性,用于配置特定操作 然后我有一个服务类/文件,看起来像: (function() { 'use strict'; angular.module('app.category').factory('categoryservice', categoryservice); /* @ngInject */ function categoryservice($http, $location, $q, exc

在配置路由时,我还配置了设置,这是一个带有静态值的对象的自定义属性,用于配置特定操作

然后我有一个服务类/文件,看起来像:

(function() {
    'use strict';

    angular.module('app.category').factory('categoryservice', categoryservice);

    /* @ngInject */
    function categoryservice($http, $location, $q, exception, logger) { 
        var service = {
            getSubMenusInformation: getSubmenuData            
        };

        return service;

        function getSubmenuData() {
            // 
            return "some data object";
        }
    }
});
在设置中,我希望使用服务类名,这样在控制器中我就可以实例化它,而无需注入,并在设置中调用我想要的方法来获取一些特定数据

大概是这样的:

(function () {
    'use strict';

    angular.module('app.core').run(Runnable);

    Runnable.$inject = ['$rootScope', 'logger', 'config'];

    /* @ngInject */
    function Runnable($rootScope, logger, config) {
        /* jshint validthis:true */
        $rootScope.config = config;

        // now, the service is not instantiated yet.
        // he won't know what categoryservice is.
        // so the code is obviously broken at this point.

        var some_specific_data = [config.settings.someProviderName].[config.settings.someProviderFunction];        

        logger.debug( 'DEBUG MODE IS ON! '+ some_specific_data );
    }
})();
我认为这应该由一个提供者来完成,但我不知道该怎么做,我遇到了一个问题,即服务或提供者名称是一个字符串,也是我想要调用的方法。 我不想把它注入控制器,因为它会随着每个路由而改变

那我就担心只运行一次

有没有人知道我如何做到这一点,或者如何在不打破模式的情况下做到这一点

最终目的是加载每个加载路线的动态数据,并根据设置值yes(是)将变慢


谢谢。

我希望我能理解你需要什么

如果每个提供程序中的数据都在更改,但仍保持相同的格式,则可以执行以下操作

(function () {
'use strict';

angular.module('app.category')
       .provider('category', category);

function category() {
    var data1Value;
    var data2Value;
    return {
        setData1: function (value) {
            data1Value = value;
        }
        setData2: function (value) {
            data2Value = value;
        }
    },
    $get: function () {
        return {
            data1: data1Value
            data2: data2Value
        };
    }
}
})();
现在我相信你在每条路线上使用不同的模块,因为你遵循约翰的风格。因此,在每个模块配置中,您将在注入中“设置模块设置Provider”后缀是必需的:category->categoryProvider:

(function () {
    'use strict';

    angular
        .module('app.someModule')
        .config('someModuleConfig', someModuleConfig);

    someModuleConfig.$inject = ['categoryProvider'];

    function someModuleConfig(categoryProvider){
         categoryProvider.setData1(data1Value);
         categoryProvider.setData2(data2Value);
    }

})();
在您的控制器中:

(function () {
    'use strict';

    angular
        .module('app.someModule')
        .controller('someController', someController);

    someController.$inject = ['category'];

    function someController(category) {
        var vm = this;
        vm.data = {};
        vm.activate = activate;
        vm.title = 'someController';

        activate();

        ////////////////

        function activate() {
            vm.data = {
                data1 = category.data1
                data2 = category.data2
            }
        }
    }
})();

我希望我能理解你需要什么

如果每个提供程序中的数据都在更改,但仍保持相同的格式,则可以执行以下操作

(function () {
'use strict';

angular.module('app.category')
       .provider('category', category);

function category() {
    var data1Value;
    var data2Value;
    return {
        setData1: function (value) {
            data1Value = value;
        }
        setData2: function (value) {
            data2Value = value;
        }
    },
    $get: function () {
        return {
            data1: data1Value
            data2: data2Value
        };
    }
}
})();
现在我相信你在每条路线上使用不同的模块,因为你遵循约翰的风格。因此,在每个模块配置中,您将在注入中“设置模块设置Provider”后缀是必需的:category->categoryProvider:

(function () {
    'use strict';

    angular
        .module('app.someModule')
        .config('someModuleConfig', someModuleConfig);

    someModuleConfig.$inject = ['categoryProvider'];

    function someModuleConfig(categoryProvider){
         categoryProvider.setData1(data1Value);
         categoryProvider.setData2(data2Value);
    }

})();
在您的控制器中:

(function () {
    'use strict';

    angular
        .module('app.someModule')
        .controller('someController', someController);

    someController.$inject = ['category'];

    function someController(category) {
        var vm = this;
        vm.data = {};
        vm.activate = activate;
        vm.title = 'someController';

        activate();

        ////////////////

        function activate() {
            vm.data = {
                data1 = category.data1
                data2 = category.data2
            }
        }
    }
})();

我是这样做的,但你的似乎好多了。函数{'use strict';angular.module'app.core'.runRunnable;Runnable.$injector=['$rootScope','logger','config','$injector'];函数Runnable$rootScope,logger,config,$injector{$rootScope.config=config;//categoryservice是来自config var dynamicService=$injector.getconfig.settings.serviceToUse;var dynamicata=dynamicService[config.settings.methodouse];logger.debugdynamicata;};我会尝试使用你的。非常感谢。我这样做了,但你的似乎好多了。函数{'use strict';angular.module'app.core'。runRunnable;Runnable。$inject=['$rootScope','logger','config','injector'];函数Runnable$rootScope,logger,config,$injector{$rootScope.config=config;//categoryservice是来自config var dynamicService=$injector.getconfig.settings.serviceToUse;var dynamicata=dynamicService[config.settings.methodouse];logger.debugdynamicata;}}的字符串,我将尝试使用您的字符串。非常感谢。