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

Dynamic provider inside controller in AngularJS

在配置路由时,我也配置了设置,自定义属性带有静态值的对象来配置特定操作。

然后我有一个服务 class/file 看起来像:

(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";
        }
    }
});

在设置上,我想要服务 class 名称我会使用这样在控制器中我可以实例化它(不注入)并调用我想要的方法(也在设置中)来获取一些具体的数据。

像这样:

(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 );
    }
})();

我认为这应该通过提供者来完成,但我不知道如何做,而且我遇到的问题是服务(或提供者)名称是一个字符串,也是我想要的方法打电话。 而且我不想在控制器上注入它,因为它会随着每条路线而改变。

那我只担心运行一次

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

最终目的是为每条路线加载动态数据 "on load" 并取决于设置值(是的,它会很慢)。

谢谢。

希望我明白你的需求。

如果每个提供程序中的数据都在变化但仍保持相同的格式,您可以这样做

(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
        };
    }
}
})();

现在我相信你对每条路线使用了不同的模块,因为你遵循了 John 的风格。因此,在每个模块配置中,您将 'set the module settings'('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
            }
        }
    }
})();