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

时间:2015-07-30 18:17:16

标签: angularjs angularjs-service

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

然后我有一个服务类/文件,如下所示:

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

我认为这应该由提供商来完成,但我不知道如何,并且我得到服务(或提供者)名称是字符串的问题,以及我想要的方法打电话。 而且我不想将它注入控制器,因为它会随着每条路线而改变。

然后我担心只运行一次。

有没有人对我如何做到这一点或如何做而不打破模式以及在哪里有任何想法?

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

感谢。

1 个答案:

答案 0 :(得分:3)

我希望我明白你的需要。

如果每个提供商中的数据都在变化但仍保持相同的格式,您可以执行类似此操作的

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

现在我相信你对每条路线使用不同的模块,因为你遵循约翰的风格。因此,在每个模块配置中,您将设置模块设置'('提供商'注入中的后缀是必需的:类别 - > 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
            }
        }
    }
})();