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

时间:2013-09-25 19:27:10

标签: javascript jquery coffeescript jquery-validate

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

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

我用“Test”替换了name.val(),然后脚本完美无缺。控制台中没有语法错误或任何错误。 我还删除了对get_exists_rule(name.val())的调用,并将其替换为一个简单的required:true,这很好。我有这个设置在其他表单上使用相同的命名方案,只是没有远程调用。

我还在get_exists_rule中抛出一个警告信息,无论它在页面加载时只执行一次,所以可能会有一些有趣的事情发生。

我已经坚持了近7个小时,我看着每一个相关的SO帖子和我能想到的任何地方,并没有找到有效的解决方案。

这是coffeescript:

  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())

以下是javascript:

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())
  }
});

1 个答案:

答案 0 :(得分:2)

使初始规则与category_name === original_name时相同。 然后当category_name更改时,添加远程规则。

这样的事情:

$('#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
      }
    }
  }
}

在服务器端,用您的语言执行以下操作: 您需要返回“true”或“false”的json字符串。

if (post["category[name]"] == original_name)
  return "true"
else 
  return category_exists(post["category[name]"])