Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4

    Mootools Ajax problema response

    Salve a tutti, sono nuovo del forum e vorrei complimentrarmi con la redazione di questo ottimo sito,
    scrivo per via di un problema con il framework mootools, una volta effettuata una richiesta con "Request" vorrei inserire il risultato all'interno di una variabile da utilizzare all'esterno della funzione OnComplete, un esempio:
    codice:
       var req = new Request({url: 'database.php'
                 onComplete: function(response) { 
                                  alert('Response: ' + response)
                                  ;},             
      		}); 	
    
    req.post({'sql': sql});
    con questo codice invio una richiesta in post a una pagina php e il risultato viene visualizzato in un alert, fin qui tutto ok, ma quando provo ad assegnare il volore di response a una variabile esterna a req qualcosa non funziona e quando la richiamo mi risulta undefined

    vi ringrazio per ogni possibile aiuto

  2. #2
    dove definisci la variabile da utilizzare? comunque, credo sarebbe più semplice se, una volta ottenuta la risposta tu la passassi ad una funzione che poi ci fa qualcosa, piuttosto che salvarla in una variabile.
    I DON'T Double Click!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4
    intanto grazie della risposta,
    in pratica sto creando una classe per semplificarmi la gestione del database quindi ciò che viene fatto con il risultato varia a seconda della situazione e qesto rende impossibile l'utilizzo di una funzione statica, la variabile è definita a livello dalla classe in modo che sia gestibile dall'esterno
    è da un pò che provo senza risultato, credo che il problema dipenda dalla natura asincrona della richiesta ajax

  4. #4
    si, infatti la funzione oncomplete viene eseguita con scope = window non il this al momento in cui la definisci.

    Devi usare il metodo bind per cambiare lo scope della funzione:

    codice:
    var TuaClass = new Class({
       initialize : function(){
           this.variable = null; //Qui salverò la risposta della chiamata AJAX
           this.req =  new Request({url: 'database.php'
                 onRequest : this.requestFunction.bind(this),
                 onComplete: this.completeFunction.bind(this)             
      	});
           this.complete = true;
       },
       requestFunction : function(){
           this.complete = false;
       },
       completeFunction : function(response){
           //qui il this è uguale all'oggetto perché hai usato il bind() senza sarebbe window
           this.variable = response;
           this.complete = true;
       }
       getLastResponse : function(){
           return this.variable;
       },
       send : function(sql){
           this.req.post({"sql" : sql});
       },
       completed : function(){
          return this.complete;
       }
    });
    
    var obj = new TuaClasse();
    
    obj.send("SELECT * FROM tabella WHERE campo = 'QUALCOSA' ORDER BY altrocampo DESC");
    if(obj.completed())
         alert(obj.getLastResponse());
    Se c'è qualcosa di non chiaro chiedi pure
    I DON'T Double Click!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4
    devo ammettere di essere nuovo di javascript e mootools, non conoscevo il bind
    cmq ho testato il codice e non ottendo nessun alert quando carico la pagina
    codice:
    if(obj.completed())      alert(obj.getLastResponse());
    risulta sempre falso e obj.getLastResponse() risulta vuoto

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4
    Trovato, pechè funzioni la richiesta deve essere sincrona, è bastato modificare:
    codice:
           this.req =  new Request({ 							  url: 'database.php', 							  async : false,              onRequest : this.requestFunction.bind(this),              onComplete: this.completeFunction.bind(this)
    e adessa funziona tutto, grazie mille!

  7. #7
    si, infatti le richieste asincrone funzionano in maniera diversa, ti conviene fare in questo modo

    codice:
    var TuaClass = new Class({
       Implements: Events,
       initialize : function(){
           this.variable = null; //Qui salverò la risposta della chiamata AJAX
           this.req =  new Request({url: 'database.php',
                 onRequest : this.requestFunction.bind(this),
                 onComplete: this.completeFunction.bind(this)             
      	});
           this.complete = true;
       },
       requestFunction : function(){
           this.complete = false;
            this.fireEvent("request", this);
       },
       completeFunction : function(response){
           //qui il this è uguale all'oggetto perché hai usato il bind() senza sarebbe window
           this.variable = response;
           this.complete = true;
           this.fireEvent("complete", this);
       },
       getLastResponse : function(){
           return this.variable;
       },
       send : function(sql){
           this.req.post({"sql" : sql});
       },
       completed : function(){
          return this.complete;
       }
    });
    
    var obj = new TuaClass();
    
    obj.addEvent("complete", function(){
         //Questo viene eseguito dopo che la richiesta Asincrona è completa
         alert("Risposta dal Server: "+this.getLastResponse());
    });
    
    obj.addEvent("request", function(){
        //Se vuoi fare qualcosa quando lanci la richiesta AJAX metti qualcosa qui
    });
    
    obj.send("SELECT * FROM tabella WHERE campo = 'QUALCOSA' ORDER BY altrocampo DESC");
    Un consiglio, dai una lettura a http://mootools.net/docs/core/Class/Class e http://mootools.net/docs/core/Class/Class.Extras
    I DON'T Double Click!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.