I am trying to use a injected dependency within a static method and of course the injected dependency is instance-scoped and can't be used within the static method.
Here is my class:
@Injectable()
export class PasswordValidationService {
constructor(private userAccountService:UserAccountService) {
}
static passwordValidator(control:AbstractControl) {
return control
.valueChanges
.debounceTime(400)
.switchMap(()=> this.userAccountService.checkCurrentPassword(control.value))
.map(res=> {
if (res.json() === true) {
return null;
}
else {
return {invalid: true};
}
}
);
}
}
My question is what is the best practice in order to use the UserAccountService
(dependency) within a static method?
edit: I redesigned my app towards using instance methods instead of static methods as follows:
Here is the validator:
import {Injectable} from "@angular/core";
import {UserAccountService} from "../../useraccount/useraccount.service";
import {AbstractControl} from "@angular/common";
import {Observable} from "rxjs/Observable";
@Injectable()
export class PasswordValidationService {
constructor(private userAccountService:UserAccountService) {
}
passwordValidator(control:AbstractControl):Observable<any> {
let validationResult = this.userAccountService.checkCurrentPassword(control.value)
.map(res=> {
if (res.json() === true) {
return null;
}
else {
return {invalid: true};
}
}
);
return validationResult;
}
}
Here is the component using the validator:
constructor(private router:Router,
private formBuilder:FormBuilder,
private stylingService:StylingService,
private sessionService:SessionService,
private passwordValidationService:PasswordValidationService) {
}
ngOnInit() {
this.signinForm = this.formBuilder.group({
credentials: this.formBuilder.group({
username: [this.credentials.username, Validators.required],
password: [this.credentials.password, [Validators.required, this.passwordValidationService.passwordValidator]]
})
});
}
Here is the error message I get:
browser_adapter.ts:82 TypeError: Cannot read property 'userAccountService' of undefined
at PasswordValidationService.passwordValidator (http://localhost:8080/app/shared/services/password-validation.service.js:18:36)
at eval (http://localhost:8080/vendor/@angular/forms/src/validators.js:137:49)
at Array.map (native)
at _executeValidators (http://localhost:8080/vendor/@angular/forms/src/validators.js:137:23)
at FormControl.eval [as validator] (http://localhost:8080/vendor/@angular/forms/src/validators.js:116:33)
at FormControl.AbstractControl._runValidator (http://localhost:8080/vendor/@angular/forms/src/model.js:178:56)
at FormControl.AbstractControl.updateValueAndValidity (http://localhost:8080/vendor/@angular/forms/src/model.js:164:29)
at new FormControl (http://localhost:8080/vendor/@angular/forms/src/model.js:304:14)
at FormBuilder.control (http://localhost:8080/vendor/@angular/forms/src/form_builder.js:36:16)
at FormBuilder._createControl (http://localhost:8080/vendor/@angular/forms/src/form_builder.js:68:25)
You can use dependency injection in a static class using method or property injection. However, you cannot use constructor injection in a static class because the constructor of a static class cannot accept any parameters.
The "Application Module" can be injected as a dependency in AngularJS.
Dependency injection, or DI, is one of the fundamental concepts in Angular. DI is wired into the Angular framework and allows classes with Angular decorators, such as Components, Directives, Pipes, and Injectables, to configure dependencies that they need.
The @Injectable() decorator defines a class as a service in Angular and allows Angular to inject it into a component as a dependency. Likewise, the @Injectable() decorator indicates that a component, class, pipe, or NgModule has a dependency on a service. The injector is the main mechanism.
Either don't make the method static or forward from an instance method
export class PasswordValidationService {
constructor(private userAccountService:UserAccountService) {
}
validate(control:AbstractControl) {
return PasswordValidationService.passwordValidator(control);
}
static passwordValidator(control:AbstractControl) {
...
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With