Javascript 如何对模块进行参数化,使其能够根据需要配置需要的应用程序?
在a模式中,我想将AngularJS应用程序的配置和实用程序分解为一个独立的模块,例如:Javascript 如何对模块进行参数化,使其能够根据需要配置需要的应用程序?,javascript,angularjs,dependency-injection,module,Javascript,Angularjs,Dependency Injection,Module,在a模式中,我想将AngularJS应用程序的配置和实用程序分解为一个独立的模块,例如: angular.module("configurer", []) .config(["$httpProvider", function($httpProvider) { $httpProvider.defaults.headers.common["Accept"] = "application/hal+json"; }]); 然后,在我的应用程序中: angular.module("app", [
angular.module("configurer", [])
.config(["$httpProvider", function($httpProvider) {
$httpProvider.defaults.headers.common["Accept"] = "application/hal+json";
}]);
然后,在我的应用程序中:
angular.module("app", ["configurer"]);
angular.module("app", ["configurer"])
.constant("Application", {
CSRF: {
headerName: "X-CSRF-TOKEN",
cookieName: "APP-CSRF-TOKEN"
}
});
我想添加一个可选的CSRF保护:
angular.module("configurer", [])
.config(["$httpProvider", function($httpProvider) {
$httpProvider.defaults.headers.common["Accept"] = "application/hal+json";
if (applicationWantsCsrfProtection) {
// implement CSRF protection
}
}]);
问题是,如何设置此应用程序WANTCSRFProtection
变量
我试图通过常数:
angular.module("configurer", [])
.config(["$injector", "$httpProvider", function($injector, $httpProvider) {
$httpProvider.defaults.headers.common["Accept"] = "application/hal+json";
if ($injector.has("Application")) {
var Application = $injector.get("Application");
if (Application.hasOwnProperty("CSRF")) {
// implement CSRF protection with Application.CSRF.* attributes
}
}
}]);
然后,在我的应用程序中:
angular.module("app", ["configurer"]);
angular.module("app", ["configurer"])
.constant("Application", {
CSRF: {
headerName: "X-CSRF-TOKEN",
cookieName: "APP-CSRF-TOKEN"
}
});
但是$injector.has(“应用程序”)
始终返回false
,无论应用程序中是否定义了应用程序
常量:
我通过提供商找到了解决方案:
(函数(角度){
变量配置=函数($injector){
console.log(“configurer config has Application:+$injector.has(“Application”);//true
};
var run=功能($注入器){
console.log(“configurer run has Application:+$injector.has(“Application”);//true
};
角度模块(“配置器”,[])
.provider(“init”,函数(){
返回{
config:config,
$get:function(){
返回{
跑:跑
}
}
}
});
})(角度);
然后,在应用程序中:
angular.module(“应用程序”、[“配置程序”])
.constant(“应用程序”{
CSRF:{
头名:“X-CSRF-TOKEN”,
cookieName:“APP-CSRF-TOKEN”
}
})
.config(函数(initProvider$injector){
initProvider.config($injector);
})
.run(函数(初始化,$injector){
初始运行($injector);
});
此解决方案的一个优点是,configurer子模块可以在不修改应用程序的情况下扩展configurer行为:
angular.module("app", ["configurer"]);
angular.module("app", ["configurer"])
.constant("Application", {
CSRF: {
headerName: "X-CSRF-TOKEN",
cookieName: "APP-CSRF-TOKEN"
}
});
(函数(角度){
变量配置=函数($injector){
console.log(“subConfigurer config has Application:+$injector.has(“Application”);//true
};
var run=功能($注入器){
console.log(“subconfigurator run has Application:+$injector.has(“Application”);//true
};
角度模块(“子配置程序”、[“配置程序”])
.config(函数(initProvider){
var configCallfront=initProvider.config;
initProvider.config=函数($injector){
配置调用前端($injector);
配置(喷油器);
};
var runCallfront=initProvider.$get().run;
initProvider.$get=function(){
返回{
运行:函数($injector){
runCallfront($injector);
运行($注射器);
}
}
};
});
})(角度);
尽管如此,我们仍然可以接受批评或更好的解决方案 我通过提供商找到了解决方案:
(函数(角度){
变量配置=函数($injector){
console.log(“configurer config has Application:+$injector.has(“Application”);//true
};
var run=功能($注入器){
console.log(“configurer run has Application:+$injector.has(“Application”);//true
};
角度模块(“配置器”,[])
.provider(“init”,函数(){
返回{
config:config,
$get:function(){
返回{
跑:跑
}
}
}
});
})(角度);
然后,在应用程序中:
angular.module(“应用程序”、[“配置程序”])
.constant(“应用程序”{
CSRF:{
头名:“X-CSRF-TOKEN”,
cookieName:“APP-CSRF-TOKEN”
}
})
.config(函数(initProvider$injector){
initProvider.config($injector);
})
.run(函数(初始化,$injector){
初始运行($injector);
});
此解决方案的一个优点是,configurer子模块可以在不修改应用程序的情况下扩展configurer行为:
angular.module("app", ["configurer"]);
angular.module("app", ["configurer"])
.constant("Application", {
CSRF: {
headerName: "X-CSRF-TOKEN",
cookieName: "APP-CSRF-TOKEN"
}
});
(函数(角度){
变量配置=函数($injector){
console.log(“subConfigurer config has Application:+$injector.has(“Application”);//true
};
var run=功能($注入器){
console.log(“subconfigurator run has Application:+$injector.has(“Application”);//true
};
角度模块(“子配置程序”、[“配置程序”])
.config(函数(initProvider){
var configCallfront=initProvider.config;
initProvider.config=函数($injector){
配置调用前端($injector);
配置(喷油器);
};
var runCallfront=initProvider.$get().run;
initProvider.$get=function(){
返回{
运行:函数($injector){
runCallfront($injector);
运行($注射器);
}
}
};
});
})(角度);
尽管如此,我们仍然可以接受批评或更好的解决方案