В Grails есть несколько великолепных встроенных тегов ajax, но я предпочитаю использовать библиотеку javascript напрямую (а именно jquery) ...
Загрузите jquery и скопируйте в веб-приложение / js / jquery.js
В разделе заголовка вашей формы gsp или вашего макета добавьте:
В вашей форме gsp я бы порекомендовал добавить атрибут id в поле ввода для имени пользователя, что упрощает ссылку на элемент по id:
В вашем методе контроллера вы можете проверить свой домен / услугу / и т.д., чтобы увидеть, если имя свободно. Ниже приведен надуманный пример, который возвращает ответ в виде JSON, но вы также можете вернуть html, чтобы заполнить div, зависит только от того, как вы хотите предупредить пользователя.
class UserController {
def checkAvailable = {
def available
if( User.findByUsername(params.id) ) {
available = false
} else {
available = true
}
response.contentType = "application/json"
render """{"available":${available}}"""
}
5, в вашей форме gsp в разделе head добавьте
<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("<em>This ID is already taken</em>").show();
}
});
}
});
});
</script>
Конечно, есть много способов реализовать это, я просто предпочитаю использовать jquery, а не некоторые встроенные функции ajaxy.