将recaptcha响应放入淘汰赛中可观察到的js

时间:2016-08-12 08:20:13

标签: javascript knockout.js

我正在使用google recaptcha,而我正在尝试将响应放入observable,然后将其发送到后端服务器。我正在努力,但我失败了。这是代码。

<div class="form-group">
  <div class="col-sm-8">
     <div class="g-recaptcha"  data-sitekey="############"></div>
  </div>
</div>

下一段代码在带有knockout的js文件中

self.recaptchaCode = ko.observable($('.g-recaptcha-response').val()); // Does not work

这是发送到后端的ajax

$.ajax({
                type: 'POST',
                url: BASEURL + 'index.php/login/loginUsingAjax/' + auth,
                contentType: 'application/json; charset=utf-8',
                data: ko.toJSON({
                    email : self.eMail(),
                    password : self.passWord(),
                    recaptcha : self.recaptchaCode()
                })
            })

我想我没有得到正确的方法来获得可观察的反应

1 个答案:

答案 0 :(得分:1)

这一行:

self.recaptchaCode = ko.observable($('.g-recaptcha-response').val());

使用您的元素在创建observable时所拥有的值设置observable 。当您请求可观察值(self.recaptchaCode())时,重新评估;你收到一个缓存的回复。

这意味着只有在实例化viewmodel时元素的值可用时,您的代码才有效。 Knockout无法神奇地观察非数据绑定的DOM元素。

我建议创建一个方法而不是一个可观察的方法:

self.getRecaptchaCode = function() { 
  return $('.g-recaptcha-response').val();
};

最好是在元素上创建value绑定,但我不确定您是否可以访问DOM的.g部分...在这种情况下,您可以使用一个“真正的”淘汰赛方式:

<input data-bind="value: recaptchaCode">

在您的viewmodel中使用self.recaptchaCode = ko.observable()