Ich habe die nächste Logik Validator, und ich möchte die Daten überprüfen, senden Sie es an den Server. Der Server antwortet gut, aber wenn ich versuche, einen Benutzer zu senden, kann ich das Formular senden. Vielen Dank. // Datei: E-Mail-Benutzer-validator.tsValidieren von E-Mail und Benutzer Angular2 fragt nach dem Server
interface IUsernameEmailValidator {
}
function checkUser(control: Control, source: string) : Observable<IUsernameEmailValidator> {
// Manually inject Http
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);
let http = injector.get(Http);
let body;
if(source == 'email'){
body = JSON.stringify({ email: control.value })
}else if(source == 'username'){
body = JSON.stringify({ username: control.value });
}
return new Observable((obs: any) =>{
if(!!control.valueChanges){
control
.valueChanges
.debounceTime(400)
.flatMap(value => http.post('/user/check', body))
.subscribe(
value =>{
obs.next(null);
obs.complete();
},
error => {
if(error.status == 500) return;
let msg = error.json().message;
obs.next({ msg: true });
obs.complete();
}
)
}
});
}
export class CustomValidators {
static checkUsername(control: Control) {
checkUser(control, 'username');
}
static checkEmail(control: Control) {
checkUser(control, 'email');
}
}
Die Komponente:
//File: main-component.ts
ngOnInit(): any{
this.registerForm = this._formBuilder.group({
'email': ['', Validators.compose([Validators.required, CustomValidators.emailValidator])],
'password': ['', Validators.minLength(8)]
})
}
Server-Controller
check: (req, res) => {
let find = {};
let email = false;
if(req.param('username')){
find.username = req.param('username');
}else if(req.param('email')){
find.email = req.param('email');
email = true;
}
User.findOne(find).exec((err, user) => {
if(err) return res.negotiate(err);
if(user && !email){
return res.status(409).json({message: 'Username taken'});
}else if(user && !!email){
return res.status(409).json({message: 'Email taken'})
}
// not taken
return res.status(200).json({message: !!user});
});
}