Grails hat einige große in Ajax-Tags gebaut, aber ich ziehe es vor, eine Javascript-Bibliothek direkt (nämlich Jquery) zu verwenden...
-
Herunterladen jquery und kopieren Sie nach web-app/js/jquery.js
-
Fügen Sie im Kopfbereich Ihres Formulars oder Ihres Layouts hinzu:
<g:javascript src="jquery.js"/>
-
In Ihrem Formular gsp würde ich empfehlen, ein id-Attribut zu Ihrem Eingabefeld für den Benutzernamen hinzufügen, macht es einfacher, ein Element durch id zu verweisen:
<input type="text" name="username" id="username" value=""/>
-
In Ihrer Controller-Methode können Sie Ihre Domäne/Dienst/etc überprüfen, um zu sehen, ob der Name frei ist. Unten ist ein konstruiertes Beispiel, das die Antwort als JSON zurückgibt, aber Sie könnten auch html zurückgeben, um ein div zu füllen, hängt nur davon ab, wie Sie den Benutzer alarmieren wollen.
class UserController {
def checkAvailable = {
def available
if( User.findByUsername(params.id) ) {
available = false
} else {
available = true
}
response.contentType = "application/json"
render """{"available":${available}}"""
}
5, Fügen Sie in Ihrem Formular gsp im Kopfbereich
<script type="text/javascript">
// wait for dom to load
$(function(){
// set onblur event handler
$("#username").blur(function(){
// if some username was entered - this == #username
if($(this).length > 0) {
// use create link so we don't have to hardcode context
var url = "${createLink(controller:'user', action:'checkAvailable')}"
// async ajax request pass username entered as id parameter
$.getJSON(url, {id:$(this).val()}, function(json){
if(!json.available) {
// highlight field so user knows there's a problem
$("#username").css("border", "1px solid red");
// maybe throw up an alert box
alert("This username is taken");
// populate a hidden div on page and fill and display it..
$("#somehiddendiv").html("This ID is already taken").show();
}
});
}
});
});
</script>
Natürlich gibt es viele Möglichkeiten, dies zu implementieren, ich bevorzuge nur zufällig Jquery gegenüber einigen der eingebauten Funktionen von Ajaxy.