2016-08-11 27 views
5

Tôi đang cố gắng tạo trình xác thực không đồng bộ tùy chỉnh, đi tới máy chủ và kiểm tra xem email đã được đăng ký hay chưa.Http không hoạt động trong xác thực không đồng bộ tùy chỉnh Angular 2

Thật không may, có vẻ như yêu cầu nhận không bao giờ bị sa thải, bởi vì không có gì xảy ra. Tôi đã thử nhiều console.log bên trong subscribe, nhưng chúng không chạy.

Tôi đã kiểm tra xem yêu cầu đó có hoạt động bên ngoài trình xác thực hay không, và điều đó có nghĩa là không phải vậy.

import { Component } from '@angular/core'; 
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; 
import { Response, Http } from '@angular/http'; 

@Component({ 
    templateUrl: 'build/pages/welcome/signup/signup.html', 
    providers: [AuthService, CustomValidators] 
}) 
export class Signup { 

    signupForm: FormGroup; 

    constructor(private formBuilder: FormBuilder, private http: Http) { 

     this.signupForm = formBuilder.group({ 
      'email': ['', Validators.required, this.checkEmail], 
     }): 
    } 

    checkEmail(control: FormControl): Promise<any> { 

      const promise = new Promise<any>(
      (resolve, reject) => { 

       this.http.get('/sharealead/main.php?action=checkEmail').subscribe(
        (res: Response) => { 
         console.log('it never gets here'); 
         console.log(res) 
         if (res.text() == 'already there') { 
          resolve({'emailTaken': true}); 
         } else { 
          resolve(null); 
         } 
        }, 
        (err) => { 
         console.log('it never gets here'); 
         console.log(err); 
        } 
       ) 
      } 
     ); 
     return promise; 
    } 

} 

Trả lời

8

Đó là vì bạn tham chiếu hàm và bạn bị mất ngữ cảnh this. Bạn có thể sử dụng phương pháp bind hoặc một chức năng gói mũi tên để khắc phục điều đó (liên kết các chức năng để instance của component):

this.signupForm = formBuilder.group({ 
     'email': ['', Validators.required, this.checkEmail.bind(this) ], 
}); 

hoặc

this.signupForm = formBuilder.group({ 
     'email': ['', Validators.required, (control:Control) => { 
      return this.checkEmail(control); 
     } ], 
}); 

Trong trường hợp của bạn, this không chứa http property ...

+0

Thật vậy, sai lầm ngớ ngẩn, có vẻ như tôi cần thêm một bài học về từ khóa này trong JavaScript (Tôi sẽ đánh dấu câu trả lời của bạn là chấp nhận trong khoảng 8 phút, khi stackoverflow cho phép) –

+0

Bạn được chào đón! Có, việc sử dụng từ khóa 'này' trong JavaScript là một chút cụ thể ... –

+0

Bạn cũng có thể hướng dẫn cách kích hoạt trình xác nhận hợp lệ như vậy trên trường mờ. Trong trường hợp của tôi, yêu cầu gửi http của nó ngay cả khi tôi đang nhập email vào hộp văn bản. Vì vậy, trước khi tôi nhập địa chỉ email của mình, nó đã gửi một số yêu cầu đến máy chủ –

Các vấn đề liên quan