欧芹远程和附加参数

时间:2014-05-15 23:39:54

标签: javascript validation parsley.js

我正在尝试将远程验证器与Parsley一起使用,而我似乎无法通过请求发送其他数据。相关字段是一个电子邮件字段,我想将其发送到服务器以查看电子邮件地址是否可用'。另外,我需要发送一个服务器需要的id参数。 id参数嵌入在我的表单中的主机'字段。

所以,我尝试使用Parsley DOM API如下:

        <input type="text" class="form-control" tabindex="15" id="email" name='email'
            data-parsley-type="email" data-parsley-type-message="Must be a valid email format"
            data-parsley-required="true" data-parsley-required-message="Email is required"
            data-parsley-remote="/invitation/allowed"
            data-parsley-remote-options='{ "type": "get", "data" : { "id": function() {return $("#host").val(); } }}'>

在API配置的最后一行中,我尝试了各种组合,以将主机字段的值输入到我的URL中。这些包括转义函数中的引号;并证明&#39;主持人&#39; (或&#39;#host&#39;)作为id属性的值。在每种情况下,我只能通过URL传递我的电子邮件地址。

请注意,我可以传递文字没有问题(例如{ "id": "TestTest" })。

我也尝试过如下使用javascript:

<script type="text/javascript" src="/js/parsley.remote.js"></script>
<script type="text/javascript">$('#employee-form').parsley({})</script>

<script type="text/javascript">
    $('#email').parsley().addConstraint('remote',
    {
        url: '/invitation/allowed',
        type: 'GET',
        data: {
            id: function () { return $('#host').val() }
        }
    })
</script>

当我这样做时,我有两个问题:未在URL中设置id,并且基本URL也不正确 - 它调用当前页面的地址(不是/邀请/允许)。

几小时前提出的这个问题类似:Remote validation for a field which depends on others

2 个答案:

答案 0 :(得分:2)

我遇到了同样的麻烦,想要为每个请求传递一个API密钥,所以我提交了一个带有该功能的拉取请求。我想它很快就会正式发布,请点击下拉请求:

https://github.com/guillaumepotier/Parsley.js/pull/645

答案 1 :(得分:1)

Parsley pull request #645似乎没有完全解决问题。它允许您在addAsyncValidator()调用中指定ajax选项,但这些选项在调用时进行评估,而不是在发出ajax请求时(例如ajax data选项在页面上填充一次) load。)因此请求中传递的任何其他表单值都不是&#34; live&#34;它们是addAsyncValidator()被调用时的价值。看来我们需要能够为data参数指定一个函数。我对Parsley.js代码进行了一些小调整,允许:

validateString中的现有代码:

  // Merge options passed in from the function with the ones in the attribute
  var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options);

然后我的补充:

  if (typeof remoteOptions.data === 'function') {
      remoteOptions.data = remoteOptions.data();
  }

然后在你的代码中:

    <input type="text" ... id="host" data-parsley-remote="" data-parsley-remote-validator="invitation" />
    <input type="text" ... id="email" data-parsley-remote="" data-parsley-remote-validator="invitation" />

    <script>
    window.Parsley.addAsyncValidator(
        'invitation',
        function (xhr) {
            return xhr.status == 200;
        },
        '/invitation/allowed',
        {
            data: function () {
                return {
                    host: $('#host').val(),
                    email: $('#email').val();
                };
            }
        }
    );
    </script>

我没有看到任何其他方法,除了销毁异步验证器并在每次相关表单值更改时重新创建它。

注意两件事:(1)函数替换未添加的数据,(2)如果 any ,您似乎需要进行异步验证相关投入的变化。