Javascript 在Angular中,提供程序和实例之间有什么区别?

Javascript 在Angular中,提供程序和实例之间有什么区别?,javascript,angularjs,module,config,Javascript,Angularjs,Module,Config,我是个新手。我正在研究模块的配置块和运行块 请查看以下代码: angular.module('myModule', []). config(function(injectables) { // provider-injector // This is an example of config block. // You can have as many of these as you want. // You can only inject Providers (not instances) /

我是个新手。我正在研究模块的配置块和运行块

请查看以下代码:

angular.module('myModule', []).
config(function(injectables) { // provider-injector
// This is an example of config block.
// You can have as many of these as you want.
// You can only inject Providers (not instances)
// into config blocks.
}).
run(function(injectables) { // instance-injector
// This is an example of a run block.
// You can have as many of these as you want.
// You can only inject instances (not Providers)
// into run blocks
});
正如您在配置块中看到的,它写着:“您只能注入提供程序(而不是实例)”

这是什么意思?有谁能解释一下提供者和实例之间的区别吗?

从这篇文章中盗取:-为了更好地理解angular中不同类型提供者的作用,绝对值得一读

但是如果我们想在注入之前配置Greeter类呢?然后我们就可以写了

例如:

然后,您可以按如下方式配置上述内容:


其实你的问题很好。为了简单起见,我们在Angular JS中定义服务以实现我们的功能。提供者是配置服务工作方式的方法之一。AngularJS中还有一些概念,即值、常量、工厂、服务和装饰器,它们可以帮助我们以不同的方式拦截服务。请查看下面的链接

回到提供者,它们用于定义应用程序范围的配置,这些配置甚至在应用程序启动之前就需要完成。由于配置块是在加载Angular JS模块之前执行的,因此我们在它们下面配置提供程序。由于此时模块尚未加载,因此您无法访问配置块内的服务

一旦$injector加载了所有模块,就会执行运行块。一旦进入运行块,就不允许再配置提供程序,因为您的服务将被加载。这就是您无法访问运行块内的提供程序的原因

让我们看一个例子。我设计的应用程序支持用户和管理员屏幕。但是与它们相关的特性是在它们各自的服务中定义的。我只想在用户登录时加载适当的服务。我们使用如下提供程序来实现这一点

定义角色提供程序

myApp.provider("roles", function rolesProvider(){
var role;
this.setRole = function(value) {
role = value;
}

this.$get = function rolesFactory() {
if(role === "user") {
return new userRole();
} else {
return new adminRole();
}
}
});
将RoleProvider配置为用户

myApp.config(["rolesProvider"], function(rulesProvider){
rulesProvider.setRole("user"); 
});
应用程序启动时,我的应用程序将配置为以用户身份而不是管理员身份运行


如果你需要更多的解释,请告诉我

快速回答:提供者将创建一个实例。在它们完成之前,您可以在config()块中使用它们。对于要在启动期间将url端点更改为的数据提供程序来说,这非常有用

但是在运行
newsomething()
之前,您可以在“Provider-Provider”部分运行一些配置代码


Service Service、Service Factory和Service Value都是提供者定义的快捷方式,但是隐藏配置部分,直接指向对象的实例化(使用
new Something()
)。

谢谢……这有助于我理解。
myApp.provider("roles", function rolesProvider(){
var role;
this.setRole = function(value) {
role = value;
}

this.$get = function rolesFactory() {
if(role === "user") {
return new userRole();
} else {
return new adminRole();
}
}
});
myApp.config(["rolesProvider"], function(rulesProvider){
rulesProvider.setRole("user"); 
});