Visualizzazione dei risultati da 1 a 9 su 9

Discussione: this classi javascript

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    500

    this classi javascript

    Salve,
    sto scrivendo una classe javascript che vi posto di seguito:
    codice:
     function Table(n){
    	this.number=n;
            this.user=Array();
            this.button=$("#table_1").find(".sitdown");
    
    	this.button.bind("click",this.sit);
    	this.li.each(function(index, element) {
                //this.user.push($(element).text()); primo problema
            });
    }
    Table.prototype.sit = function(){
    	//alert(this) secondo problema
    }
    Se io avessi tante istanze di Table, come faccio a ovviare il primo problema? In quel caso this non è più la mia istanza ma l'oggetto all'interno dell'each.
    Per quanto riguarda il secondo problema, this è l'oggetto sul quale si scatena l'evento e non l'istanza table, anche qui, come faccio a usare l'istanza??

    Grazie!

  2. #2

    Re: this classi javascript

    codice:
     function Table(n){
    	this.number=n;
            this.user=Array();
            this.button=$("#table_1").find(".sitdown");
    
    	this.button.bind("click",this.sit.bind(this));
    	this.li.each(function(index, element) {
                //this.user.push($(element).text()); primo problema
            }.bind(this));
    }
    Table.prototype.sit = function(){
    	//alert(this) secondo problema
    }
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  3. #3
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    per quanto riguarda il primo problema ogni volta che ho un this che si riferisce alla classe, all'inizio della function scrivo

    var _self = this

    in questo modo se devo riferirmi all'oggetto uso _self anche dall'interno di una funzione anonima che mi cambia il contesto di this.

    il secondo problema sinceramente non l'ho capito. Quel this dovrebbe riferirsi alla table... magari prova a postare il codice in cui dichiari l'oggetto e chiami il metodo.

  4. #4
    - crea una variabile _self come ti ha suggerito rsdpzed
    - Utilizza quella invece di this (perché "this" può cambiare in base al contesto)
    - non passare la funzione _self.sit ad un metodo jQuery perché jQuery ne cambia il contesto.


    codice:
    function Table(n){
    
    	var _self = this; // soluzione
    
    	this.number=n;
            this.user=Array();
            this.button=$("#table_1").find(".sitdown");
    
    	this.button.bind("click",function(e) {_self.sit()}); // <----- non chiamare direttamente la funzione
    	this.li.each(function(index, element) {
                _self.user.push($(element).text()); primo problema
            });
    }
    Table.prototype.sit = function(){
    	// do something
    }

    La soluzione proposta da mxa credo sia anche valida, ma la funzione "bind" (nativa) non è supportata da Internet Explorer 8 e inferiori. Quindi dipende dal tuo target (potresti anche trovare una patch per IE e usare il metodo di mxa)


  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    500
    Intanto grazie a tutti per le risposte!
    Ma _self è visto dal metodo sit?

    Perché il contesto di this quando il metodo sit viene richiamato è il bottone che scatena l evento e non l istanza table.
    Grazie per le risposte in anticipo

  6. #6
    Originariamente inviato da Vicar
    Intanto grazie a tutti per le risposte!
    Ma _self è visto dal metodo sit?

    Perché il contesto di this quando il metodo sit viene richiamato è il bottone che scatena l evento e non l istanza table.
    Grazie per le risposte in anticipo
    No self non è visto dal metodo sit.
    Li' dentro puoi usare this se fai come ti ho detto

    codice:
    this.button.bind("click",function() {_self.sit()});

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    500
    Non ho ancora testato ma mi fido di te e ti chiedo: come mai prima this era l'oggetto sul quale veniva scatenato l'evento mentre come hai detto tu no?

    graize per la rispota

  8. #8
    Originariamente inviato da Vicar
    Non ho ancora testato ma mi fido di te e ti chiedo: come mai prima this era l'oggetto sul quale veniva scatenato l'evento mentre come hai detto tu no?

    graize per la rispota
    Perché nel tuo caso tu passi la funzione a un metodo jQuery che poi la chiama cambiando lo scope (si fa con funcName.call(scope)).

    Nel mio caso la chiamo io direttamente non cambiando lo scope (col classico funcName())

    In soldoni :-)

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    500
    Grazie mille, sei stato esaustivo

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.