0

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

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

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

我还在 get_exists_rule 中抛出了一条警报消息,无论如何它只会在页面加载时执行一次,因此可能会发生一些有趣的事情。

我已经连续坚持了将近 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())

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

1 回答 1

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]"])
于 2013-09-25T20:22:03.213 回答