Angular 2 Recaptcha 2 Callback

时间:2016-01-24 11:02:17

标签: typescript angular recaptcha

目前我正试图在Angular 2 Typescript中使用Google Recaptcha v2。我在注册表单中使用它。假设我有一个包含以下内容的表单:

<form id="signup-form">
  <div class="g-recaptcha" data-callback="verifyCallback" data-sitekey="6LetChQTAAAAACq4lmSL0L1-4rv47ZPrFKrkWOLf"></div>
</div>

在我的注册类中,我使用以下代码在名为displayRecaptcha()的方法中显示小部件:

displayRecaptcha(){
    var doc = <HTMLDivElement>document.getElementById('signup-form');
    var script = document.createElement('script');
    script.innerHTML = '';
    script.src = 'https://www.google.com/recaptcha/api.js';
    script.async = true;
    script.defer = true;
    doc.appendChild(script);
    var d = document.createElement('script');
    d.innerHTML = `
    var verifyCallback() = function(response) {
     alert(response);
    };`
    document.querySelector('head').appendChild(d);
}

使用上面的代码,我能够显示recaptcha,但我只能使用在Javascript中定义的verifyCallback()来运行回调。因为我使用的是Typescript,无论如何都要使用Signup类中定义的方法而不是Javascript来运行回调?

2 个答案:

答案 0 :(得分:18)

我不认为你能够将回调引用传递给脚本,但是你可以通过使用typescript随后可以访问的全局变量来修补它。

@Component({...})
export class MyComponent{

  constructor(){
    window['verifyCallback'] = this.verifyCallback.bind(this);
  }

  displayRecaptcha(){
    var doc = <HTMLDivElement>document.getElementById('signup-form');
    var script = document.createElement('script');
    script.innerHTML = '';
    script.src = 'https://www.google.com/recaptcha/api.js';
    script.async = true;
    script.defer = true;
    doc.appendChild(script);
  }

  verifyCallback(response){
    alert(response);
  }
}

答案 1 :(得分:0)

为了防止任何人发现它有用,我还提出了将Google reCAPTCHA集成到我的Angular表单中的解决方案,并将其作为库发布在此处:

https://github.com/JamesHenry/angular-google-recaptcha

它为您提供了一个简单的组件,可以与模板驱动或反应形式一起使用:

<recapthca [(ngModel)]="" (scriptLoad)="" (scriptError)="">

<recapthca [formControl]="" (scriptLoad)="" (scriptError)="">

这意味着您根本不需要担心注册全局回调或处理脚本加载!