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;}}的字符串,我将尝试使用您的字符串。非常感谢。