我正在尝试使用标准的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())
}
});
答案 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]"])