Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

[Resolvido] jQuery + MooTools...

Recommended Posts

Implementei o "plugin" Mutator para que os módulos de Classe da MooTools pudessem funcionar em conjunto com a jQuery.

 

Funciona perfeitamente, as classes criadas, métodos... Muito interessante.

 

Mas a jQuery (ou o motor do JavaScript, não sei) está "sobrescrevendo" o escopo de this:

 

var Analyzer = new Class ({
	
        // "NameSpace" for Mutator

	jQuery: 'Analyzer',
	
	initialize: function() {
		
            // Class constructor
	},
	
	showResults: function() {
		
		$.ajax({ type:	   'POST',
                         url:	   '/some/url',
				
                         data:	   $( 'form' ).serialize(),
				
                         success:  this.onSuccess,
                         error:	   this.onFail
		});
	},
	
	onSuccess: function( data, textStatus ) {
		
		var error = $( data ).find( 'error' ).text();
		
		if( error != '' ) {
			return this.onError( error );
		}
		
                // Faz alguma coisa
	},
	
	onError: function( message ) {
		alert( message );
	},
	
	onFail: function( xhr ) {
		
		alert( '[ ' + xhr.status + ' ] ' + xhr.statusText );
	}
});

$( document ).ready( function() {

	// Analyzer Object
	
	var Obj = new Analyzer;

        $( '#analyze' ).click( function() {
		
		Obj.showResults();
		
		return false;
	})
})
O código funciona legal. Se o XML retornado não possuir texto na tag error (já que não consegui verificar se a dita tag existe ou não) tudo ocorre bem.

 

P.S.: Esse "ocorre" bem significa abrir um jQueryUI.Dialog ^_^

 

Mas se contiver texto, isto é, achou a tag error, dispara o método onError que eu defini.

 

MAS, o Firebug acusa como this.onError is not a function. Pesquisei em vários lugares e vi que é porque alguma coisa está alterando o escopo de this.

 

Usando aquelas funções-zinhas mágicas em JS, portadas do PHP, fiz um equivalente a print_r sobre this e vi que o retorno é o objeto XmlHttpRequest retornado por $.ajax, ao invés do objeto Analyzer, como quando usado no próprio contexto da requisição.

 

Li também que tem um "truque" criando uma variável chamada self com o valor de this e sempre usar esse self onde normalmente se usaria this.

 

Mas daí, nem em casos de sucesso funciona, pois, com um simples alert() é possível ver que esse self tem o valor de Window.

 

[EDIT]

 

Por quê o fórum transforma o camelCase do meu onError, com "E" maiúsculo em minúsculo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Post UP não é permitido, mas vou postar assim mesmo apenas para que a solução fique separada da dúvida.

 

Lendo muito no Oráculo Jr. (não lembro exatamente qual tópico), percebi que tinha de perpetuar o escopo atual (da classe) de this para os outros métodos da classe, para que não recebam o escopo "errado".

 

Para isso, temos Bind, que vincula um manipulador de eventos ao elemento aplicado. A exemplo da opção success de $.ajax:

 

this.onSuccess.bind( this ),
Simples assim.

 

Dessa forma o escopo correto da classe é passado para o método, por mim nomeado onSucess, ao invés do, no caso, objeto XmlHttpRequest.

 

Espero que ajude mais alguém.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.