如何使用jQuery远程验证依赖于表单中另一个字段的字段?

Kev*_*ani 23 forms validation jquery jquery-validate

我有一个表单,我使用远程验证来检查数据库中是否已存在电子邮件地址.然而,问题在于,在这种形式上,用户可以在几个不同的"组"之间进行选择,并且每个组具有其自己的不同的电子邮件地址集(因此相同的电子邮件可以在每个组中存在一次).

组选择是表单上的下拉列表,电子邮件地址是具有远程验证的输入字段.我有几个问题.首先,我已经设置了这样的远程规则:

remote: {
    url: 'remote_script.php',
    data: {  group_id:  $('select.group_id').val() }
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎将group_id参数静态设置为select中的第一个值.意思是,如果我更改选择,然后再次触发远程验证,则group_id参数不会更改

首先,如何使此参数动态化,具体取决于表单中select的值?

其次,如何在电子邮件地址字段中手动触发远程验证?当group_id select更改时,我想在电子邮件地址字段上重新触发远程验证(不更改字段的值).我试过用

$(selector).validate().element('.email_addr')
Run Code Online (Sandbox Code Playgroud)

但这似乎只触发标准验证(必需,电子邮件),而不是远程调用.

Kev*_*ani 38

找到我问题第二部分的解决方案:

 $(".email_addr").removeData("previousValue");
Run Code Online (Sandbox Code Playgroud)

将删除远程请求的缓存,并允许使用.element()再次触发远程请求.

因此我的代码如下:

$("select.group_id").change(function() {
    $(".email_addr").removeData("previousValue"); //clear cache when changing group
    $("#customer_form").data('validator').element('.email_addr'); //retrigger remote call
    //my validator is stored in .data() on the form
});
Run Code Online (Sandbox Code Playgroud)

解决方案在这里找到:解决方案

我的问题的第一部分最初由@Jeffery To回答

所有需要做的就是将参数的值更改为函数,而不仅仅是值.Jeffery的例子在下面复制给未来的googlers:

remote: {
  url: 'remote_script.php',
  data: {
    group_id: function () {
        return $('select.group_id').val();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Jef*_* To 8

从远程的第二个示例看,函数(在验证期间评估)可以用于数据,因此

remote: {
    url: 'remote_script.php',
    data: {
        group_id: function () {
            return $('select.group_id').val();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

应该管用.

对于第二个问题,您是否尝试将验证规则传递给validate()