ユーザー名が既に存在するかどうかを確認するために、knockout.js を使用してカスタム検証ルールを設定するのに問題があります。私の理解では、戻り値が true の場合はエラーはなく、それ以外の場合はエラーが設定されます。
カスタム検証の例を次に示します
//val is the username in question and searchType is the type of search(username or email)
function checkValue(val, searchType){
if(searchType == 'userName'){
$.post("/users/check_if_exists",{ 'type':'username', 'value': val },function(data) {
var info = JSON.parse(data);
if(info.username_availability == "available"){
return searchType;
//I know this is working because I've alerted the searchtype here and it displays properly
}
else{
return "unavailable";
}
});
}
}
ko.validation.rules['checkIfExists'] = {
validator: function (val, searchType) {
return searchType == checkValue(val, searchType); //if the username is availble, the searchType is returned back so it would return searchType == searchType which should be true meaning there are no errors
},
message: 'This username is taken, please select another.'
};
ko.validation.registerExtenders();
ネットワーク タブを確認したところ、POST は正しい値を返しています。値が利用可能な場合は、searchType を返します。そうすることで、真であるはずの searchType == searchType を比較します。しかし、そうではありません。
私がやろうとしていることを達成する他の方法はありますか?
アップデート
ここに私が今持っているものがあります
function checkValue(val, searchType, callback) {
var callback = function(data) {
return true;
}
$.post("/users/check_if_exists", { 'type':'username', 'value': val }, function(data) {
info = JSON.parse(data);
if(info.username_availability == "available"){
callback(true);
} else {
callback(false);
}
});
}
ko.validation.rules['checkIfExists'] = {
async: true,
validator: function (val, searchType) {
alert(checkValue(val, searchType));//returns undefined
return checkValue(val, searchType);
},
message: 'This username is taken, please select another.'
};
ko.validation.registerExtenders();