Javascript 在angular2中使用无注入的服务
我是angular2的新手,我有一个类在angular2中有静态函数,我想在其中一个静态函数上实现一个http请求 我有管理表单验证的静态类Javascript 在angular2中使用无注入的服务,javascript,angular,Javascript,Angular,我是angular2的新手,我有一个类在angular2中有静态函数,我想在其中一个静态函数上实现一个http请求 我有管理表单验证的静态类 FORM VALIDTION this.userform = this._formbuilder.group({ first_name: [this.user.first_name, Validators.required], last_name: ['', Validators.required], username: ['', Valida
FORM VALIDTION
this.userform = this._formbuilder.group({
first_name: [this.user.first_name, Validators.required],
last_name: ['', Validators.required],
username: ['', Validators.compose(
[
Validators.required,Validators.minLength(5)
]
)],
password: ['',Validators.compose([
Validators.required,ValidationService.passwordValidator
])],
email: ['', Validators.compose([
Validators.required,ValidationService.emailValidator
])],
role: ['', Validators.required],
})
在ValidationService
constructor(private _http:Http){}
static passwordValidator(control) {
if(control.value != undefined){
if (!control.value.match(/^(?=.*[0-9])[a-zA-Z0-9!@#$%^&*]{6,100}$/)) {
return { 'invalidPassword': true };
}
}
}
static emailValidator(){
return this._http. //this returns an error i would like to
//query server to see if email exists
}
在我上面的例子中,我如何在静态函数中使用http,可能是通过将它分配给一个变量
那就是让http…
这是正在使用的,但它是在RC5中,它对我来说是失败的简短回答: 你不应该做那样的事。将类作为服务注入,不要使用静态方法 长答案: 首先,我不相信这在RC5中起作用 第二,如果不将类添加到注入器中(不将其作为构造函数属性传递给另一个服务/组件),则不应以angular的形式调用它,尽管在您的理解中它可能是服务 第三,角度服务的静态方法几乎毫无意义。是的,在某些情况下它可能会有所帮助(angular2中的服务可能有多个实例),但是我相信这不是您的情况 如果您想使用角度服务(并且
Http
是一个角度服务),您必须像我上面所说的那样将它们作为构造函数属性注入另一个服务/组件,这意味着如果您想使用Http
,您需要将您的服务注入
所以答案是否定的,你不能用一种好的方式
然而,有一些变通办法
首先,将Http
实例传递给静态函数很简单:
static emailValidator(http: Http) {
在您的组件中:
ValidationService.emailValidator(this.http)
其中this.http
是http注入到组件中的
另一种方式。服务很容易由您自己创建。如果服务在构造函数中没有注入请求(不注入任何内容),您只需执行以下操作即可
let myhttp = new Http();
但是,原始的Http
需要注入两种东西,请参见:
因此,您还需要将另外两个实体/服务作为参数传递,您可能还需要实例化它们。。。最后,您正在编写自己的注入器
第三种方法是拿一个标准的角式喷油器,试着绕着它转
这一切都可能奏效,但作为一名开发人员,如果我需要支持这样的东西,我会哭。有一种方法是创建单例静态实例。在ValidationService中使用以下代码。在构造函数中,我们将静态实例变量分配给当前实例 现在我们可以在静态方法中访问实例,并动态使用Http服务
static _instance: ValidationService;
constructor(private _http: Http) {
if (!ValidationService._instance) {
ValidationService._instance = this;
}
return ValidationService._instance;
}
在emailValidator中使用以下代码:
static emailValidator():Observable<any> {
return this._instance._http.get("").map((data) => {
});
}
但作为一名开发人员,如果我需要支持类似的东西,我会哭的
+1回答不错smnbbrv,我决定将验证器更改为一项服务,但探索是否有其他选项可能会在以后派上用场是很好的,我也希望它能帮助某些人,因为有时了解这些东西是有用的。一周前,我遇到了一个类似的问题:将服务实例传递给一个简单的类并将其直接传递给类构造函数(第一个解决方法)有助于实现这一点。第二种解决方法实际上非常适用于对服务进行单元测试,因此这也很有帮助。您能检查一下我实现的但出现错误的方法吗
static emailValidator():Observable<any> {
return this._instance._http.get("").map((data) => {
});
}
ValidationService.emailValidator().subscribe((data)=>{
});