Javascript jquery验证插件,条件远程调用未按预期工作

Javascript jquery验证插件,条件远程调用未按预期工作,javascript,jquery,coffeescript,jquery-validate,Javascript,Jquery,Coffeescript,Jquery Validate,我正在尝试使用标准jquery验证插件设置条件远程调用 问题是,当我在validate方法中传入name.val()时,页面加载时,它始终是在输入文本字段中设置的名称。文本框中的名称永远都不是 我将name.val()替换为“Test”,然后脚本就可以完美地运行了。控制台中没有语法错误或任何错误我还删除了对get_exists_规则(name.val())的调用,并将其替换为一个简单的required:true和it's fine。我已将此设置用于具有相同命名方案的其他表单,只是没有远程调用。

我正在尝试使用标准jquery验证插件设置条件远程调用

问题是,当我在validate方法中传入name.val()时,页面加载时,它始终是在输入文本字段中设置的名称。文本框中的名称永远都不是

我将name.val()替换为“Test”,然后脚本就可以完美地运行了。控制台中没有语法错误或任何错误我还删除了对get_exists_规则(name.val())的调用,并将其替换为一个简单的required:true和it's fine。我已将此设置用于具有相同命名方案的其他表单,只是没有远程调用。

我还在get_exists_规则中抛出了一个警报消息,不管发生什么,它在页面加载时只执行一次,因此可能会有一些有趣的事情发生

我已经连续7个小时被困在这个问题上了,我查看了所有相关的SO帖子和我能想到的任何地方,但没有找到一个有效的解决方案

这是咖啡脚本:

  name = $("#category_name")

  get_exists_rule = (category_name) ->
    if original_name is category_name
      required: true
      maxlength: 64
    else
      remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }

  category_form.validate
    errorElement:
      "span"
    rules:
      "category[name]":
        get_exists_rule(name.val())
var get_exists_rule, name;

name = $("#category_name");

get_exists_rule = function(category_name) {
  if (original_name === category_name) {
    return {
      required: true,
      maxlength: 64
    };
  } else {
    return {
      remote: {
        url: "/dashboard/categories/exists/" + title_to_slug(category_name),
        type: "POST",
        async: false
      }
    };
  }
};

category_form.validate({
  errorElement: "span",
  rules: {
    "category[name]": get_exists_rule(name.val())
  }
});
下面是javascript:

  name = $("#category_name")

  get_exists_rule = (category_name) ->
    if original_name is category_name
      required: true
      maxlength: 64
    else
      remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }

  category_form.validate
    errorElement:
      "span"
    rules:
      "category[name]":
        get_exists_rule(name.val())
var get_exists_rule, name;

name = $("#category_name");

get_exists_rule = function(category_name) {
  if (original_name === category_name) {
    return {
      required: true,
      maxlength: 64
    };
  } else {
    return {
      remote: {
        url: "/dashboard/categories/exists/" + title_to_slug(category_name),
        type: "POST",
        async: false
      }
    };
  }
};

category_form.validate({
  errorElement: "span",
  rules: {
    "category[name]": get_exists_rule(name.val())
  }
});

使初始规则与类别名称===原始名称时相同。 然后,当类别名称更改时,添加远程规则

大概是这样的:

$('#category_name').on('change', function() {
  $( "#category_name" ).rules( "add", {
    remote: {
      url: "/dashboard/categories/exists/" + title_to_slug(category_name),
      type: "POST",
      success: function(exists) {
        if(title_to_slug(category_name) === original_name) {
          return true;
        else {
          return exists;
        }
      }
    }
  });
});
编辑

解决方案默认使用验证器的远程规则,而不是在更改时添加规则

rules: {
  "category[name]": {
    required: true
    maxlength: 64
    remote: {
      url: "/dashboard/categories/valid_category",
      type: "POST",
      data: {
        "category[name]": function() { 
           return title_to_slug(name.val());
        },
        original_name: original_name
      }
    }
  }
}
在服务器端,使用您的语言执行以下操作: 您需要返回一个json字符串“true”或“false”


此时的name.val()是什么?当页面加载时,它是输入字段的值,它从不改变该值。那么name是什么呢?是一个引用输入的jquery obj吗?是的,我编辑了这篇文章以包含它,它只是通过id引用节点。我还尝试直接引用它,而不使用额外的变量,以防出现一些奇怪的缓存问题,但它也失败了。如果将name.val()传递给返回规则的函数,它将在页面加载时传递该值。因此,原始名称将始终===类别名称这几乎有效,我将其更改为附加到表单的“提交”事件中,以减少垃圾邮件。新的问题是,假设我执行以下步骤:1。将类别更改为我知道存在的名称,然后它会正确地给我一条失败消息,2。将类别更改为ok名称,它仍然失败,但如果我返回并再次更改它并切换字段/返回,它将允许我通过。关于如何纠正这种行为的想法?非常感谢您的帮助。如果我把它也放在字段的更改/模糊事件上,同样适用。如果一直尝试使用原始名称提交它,也会失败。您在哪里设置原始名称?你确定没有改变吗?我在文件顶部设置了它,它是name.val()的副本。我还将更改规则应用于表单提交事件,但当字段更改时,它似乎仍会触发,我可以感觉到它滞后于输入。知道为什么吗?这是整个cs文件:,和js版本:--我不知道为什么pastie要在第一个函数中添加一个额外的->,忽略它。此外,我还将服务器更改为接受GET而不是POST,这样可以更轻松地调试exists方法(它确实有效)。我不确定如何使用它来调试此问题,我只做了控制台日志记录。远程通话让人感觉有些东西坏了。它明显落后于我的电脑,现在我让它以某种方式提交了一个不应该通过的名称。