2016-02-20 21 views
22

1. Thậm chí có được hỗ trợ bởi Angular chưa? thấy this mở vấn đềCách triển khai Trình xác thực không đồng bộ hóa tùy chỉnh trong Angular2/4/5

2. Nếu có, sau đó những gì là sai trong các mã dưới đây

export class someClass{ 

    myForm:ControlGroup; 

    constructor(public http:Http, public formBuilder:FormBuilder) 
     this.myForm = formBuilder.group({ 
      ImageId: ["", Validators.required, this.asynValidator] 
    }); 

    asyncValidator(control: Control): {[key: string]: any} { 

     return new Promise (resolve => { 

      let headers = new Headers(); 
      headers.append('Content-Type', 'application/json'); 

      this.http.get('http://localhost/ImageIdValidate?id='+ control.value, {headers:headers}) 
       .map(res => res.json()) 
       .subscribe(data => { 
        console.log(data); 
        if(data != null) { 
         resolve({"duplicate": true}) 
        } 
        else resolve(null);  
       }) 
      }); 
     }); 
     } 
    } 

Nó thậm chí không thực hiện một yêu cầu máy chủ.

Trả lời

26

Bạn cần phải ràng buộc phương pháp của bạn trên ví dụ thành phần chính nó như mô tả dưới đây:

this.myForm = formBuilder.group({ 
      ImageId: ["",  
       Validators.required, 
       this.asynValidator.bind(this)] 
    }); 

Nếu không, bạn sẽ không thể sử dụng thuộc tính http để thực hiện yêu cầu của bạn.

Bài viết này cũng có thể cung cấp cho bạn một số gợi ý về hình thức xác nhận không đồng bộ (xem phần "xác nhận không đồng bộ"):

+7

Thực tế, đó là cách JavaScript hoạt động. Khi bạn tham khảo một phương pháp bạn mất đối tượng nó được gắn vào. Bạn có thể ép buộc điều này bằng cách sử dụng phương thức liên kết ... –

+1

Khi tôi bắt đầu nghĩ rằng tôi đang trên đường trở thành PRO một ngày nào đó, những thứ như thế này làm tôi cười. Nhưng dù sao, là [câu hỏi này] (http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback) có liên quan? –

+1

Trong thực tế, OOP trong JavaScript khác với các ngôn ngữ như Java và C++. Với từ khóa lớp, bạn không thực sự định nghĩa các lớp "đúng" như với các ngôn ngữ. JavaScript sử dụng OOP dựa trên nguyên mẫu. Có câu hỏi bạn trích dẫn có liên quan đến vấn đề này. –

-1

Hello guys nhờ cho các giải pháp. Tuy nhiên nó không làm việc cho tôi ra khỏi hộp.

vấn đề là trình xác thực async phải là tham số tiếp theo như một phần của trình xác thực. vì vậy, những gì hiệu quả đối với tôi là

this.myForm = formBuilder.group({ 
     ImageId: ["",  
      [Validators.required], 
      [this.asynValidator.bind(this)]] 
}); 

và tadaa !! cơn đau đầu đã biến mất. hy vọng nó sẽ giúp ai đó.

+0

Sự khác biệt duy nhất tôi có thể thấy là bạn đã thêm một số chi tiết [] so với bài trả lời. Và bạn đã không đề cập đến lý do tại sao thêm [] yêu cầu. Đây không phải là một anser hữu ích – MJK

0

như các phiên bản mới hơn của góc, nhưng phiên bản trước 5.0.0 bạn sẽ thêm các validator async như là đối số thứ ba cho formcontrol của bạn:

myControl: ['', [Validators.required], [this.asyncValidator.bind(this)]] 

kể từ phiên bản 5.0.0 bây giờ bạn có thể đánh dấu sự xác nhận như vậy:

myControl: ['', {validators: [Validators.required], 
       asyncValidators:[this.asyncValidator.bind(this)]}] 
Các vấn đề liên quan