Quero compartilhar nesse post como tenho feito para trabalhar com requisições Ajax nas minhas aplicações usando Web API.
Criando o método NS.util.ajaxCall
O primeiro ponto é que, não sei por qual motivo, tive que deixar bem explícito na requisição que o formato que estou enviando é JSON. Do contrário o Web API não consegue receber os parâmetros. Para facilitar, criei uma função genérica que faz essas requisições especificando que o formato é JSON (ver linha 18).
NS.util = (function () {
var self = this;
self.ajaxCall = function (options) {
var defaultOptions = {
url: '/',
type: 'GET'
}
if (typeof options == 'object') {
options = $.extend(defaultOptions, options);
} else {
options = defaultOptions;
}
$.ajax({
type: options.type,
url: options.url,
data: options.data,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: options.success,
error: options.error,
complete: options.complete
});
}
return self;
})();
Por exemplo, digamos que eu queira enviar um POST para uma determinada URL. Seria assim:
(...)
NS.util.ajaxCall({
type: 'POST',
url: '/clientes',
data: self.getData(),
success: function (data) {
self.items.add(data);
}
});
(...)
Ainda não existe nada de muito especial nesse encapsulamento, no entanto, criar esse wrapper irá nos ajudar bastante mais a frente.
Criando o método NS.carregando.[exibir|ocultar]
Vamos agora implementar um método que exiba uma mensagem para o usuário toda vez que uma requisição Ajax é feita. Se a forma para dar esse ‘feedback’ ao usuário for a mesma para todas as chamadas, como controlar que todas as requisições acabaram? Resolvi esse problema encapsulando a exibição da mensagem e usando um contador. Toda vez que o método recebe uma chamada para exibir a mensagem o contador é incrementado, do contrário o contador é decrementado. Quando o valor chega em zero a mensagem é ocultada. Veja como ficou:
NS.carregando = (function ($) {
var count = 0;
function exibir() {
$('.loading').fadeIn('fast');
count++;
}
function ocultar() {
count--;
if (count <= 0) {
count = 0;
$('.loading').fadeOut('fast');
}
}
return {
exibir: exibir,
ocultar: ocultar
};
})(jQuery);
Juntando as duas coisas
Se sabemos que é possível exibir uma mensagem de ‘feedback’ (carregando) toda vez que uma chamada Ajax é feita, porque não adicionar isso ao método ajaxCall (linha 13)? Note algo importante, não passamos mais o método “complete” direto para o jQuery, chamamos o código para ocultar a ‘feedback’, e só depois chamamos o método complete (linhas 22 a 27).
NS.util = (function () {
var self = this;
self.ajaxCall = function (options) {
var defaultOptions = {
url: '/',
type: 'GET'
}
if (typeof options == 'object') {
options = $.extend(defaultOptions, options);
} else {
options = defaultOptions;
}
NS.carregando.exibir();
$.ajax({
type: options.type,
url: options.url,
data: options.data,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: options.success,
error: options.error,
complete: function () {
NS.carregando.ocultar();
if ($.isFunction(options.complete)) {
options.complete();
}
}
});
}
return self;
})();
É importante fazermos isso no método complete e não no success, pois queremos que o método NS.carregando.ocultar() seja chamado independente da requisição funcionar ou dar algum erro.
É isso, feliz 2013.
Curtir isso:
Curtir Carregando...