[quote=pauloaguila]Fala Rafael, obrigado por responder… eu fiz o que você indicou, mas devo estar fazendo algo errado, pois não funcionou…vê só…
criei o método do json no controller do produto:
@Get("/categoria/buscacategoria.json")
public void buscaCategoriaJson(String q){
result.use(json()).withoutRoot()
.from(cdao.busca(q))
.exclude("id_categoria")
.serialize();
}
[/quote]
Se o nome do argumento é ‘q’, você precisa passar o ‘q’ no data do ajax… Sugiro você trocar de ‘q’ para ‘term’…
Você não vai usar o produto tambem para pegar as categorias de determinado produto?
[quote=pauloaguila]
e meu jsp ficou assim:
<script type="text/javascript">
$(document).ready( function() {
$('#categoria').autocomplete({
source:
function(request, response){
$('#categoria').addClass('inputLoading16'); // Coloca um gif animado para indicar um loading
$.ajax({
url: '<c:url value="/produtos/buscacategoria.json"/>', // A URL que vai entregar um JSON de categoria, baseado na busca... Dica, use o result.use(Results.json()) do VRaptor.
type: 'post',
data: {
term: $.trim(request.term), // O que está sendo digitado pelo usuário.
produto: $('#produto').val() // Passe o produto também, para trazer as categorias referentes somente à esse produto.
},
success: function(data) { // data é um JSON de categoria, acredito que você quer pegar o name...
response($.map(data,
function(categoria){
return {
label: categoria.descricao,
value: categoria.descricao,
id: categoria.id_categoria // Você pode criar quantas variáveis quiser, mas o plugin usa somente Label e Value... Essa aqui é só para eu te mostrar como usar esse ID...
};
}
));
$('#categoria').removeClass('inputLoading16'); // Remove o loading...
},
error: function(){
$('#categoria').removeClass('inputLoading16'); // Em caso de erro tambem remove o loading...
}
});
},
minLength: 0,
select: function(event, ui){ // Acionado quando um usuário seleciona um registro
alert('ID da categoria selecionada: ' + ui.categoria.id_categoria); // Você também pode acessar o label e o value...
},
open: function () { // Função bem interessante que vai deixar a primeira ocorrência da palavra digitada em negrito...
var data = $(this).data('autocomplete');
data.menu.element.find('a').each(function () {
var self = $(this);
var keywords = $.trim(data.term).replace(/^(\*)/g, '').replace(/\s/g, '\\ ');
if (keywords.length > 0)
self.html(self.text().replace(new RegExp('(' + keywords + ')(.*)', 'gi'), '<b>$1</b>$2'));
});
}
});
});
</script>
<form action="<c:url value="/produtos"/>" method="POST">
<fieldset>
<legend>Adicionar Produto</legend>
<label for="nome">Nome:</label>
<input id="nome" type="text" name="produto.nome" value="${produto.nome }"/>
<label for="descricao">Descrição:</label>
<textarea id="descricao" name="produto.descricao">${produto.descricao }</textarea>
<label for="preco">Preço:</label>
<input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
<label for="categoria">Categoria:</label>
<input id="categoria" type="text" name="produto.categoria" value="${produto.categoria }"/>
<button type="submit">Enviar</button>
</fieldset>
</form>
Fiquei com dúvida na url ali, acho que não está correta. Mas deve ter outros erros aí tbm. Agradeço novamente sua ajuda
[/quote]
A url precisa ser ‘/categoria/buscacategoria.json’ pois foi o que você colocou no seu método. Se você olhar bem, no seu método, você está esperando um GET… Ou seja, troque o type: ‘post’ para type: ‘get’…
Eu acho que vc vai precisar pegar as novas versões do jquery e do jquery ui, pois esse método autocomplete existe no jquery ui… Apague o antigo js do autocomplete:
http://jquery.com/
http://jqueryui.com/
PS: eu vi que mudou o nome de ‘item’ para ‘categoria’. Você precisa deixar como ‘item’ pois o plugin usa ‘item’…