2016-01-15 13 views
5

Creo una semplice estensione jQuery (è la mia prima).crea l'estensione jquery. problemi con scope

(function($){ 
    var MyClass = function(opt){ 
    //.. 
    }; 
    //one of the methods of my extension 
    $.fn.myExtension = function(opt){ 
    this._ext = new MyClass(opt); 
    return this; 
    }; 
    $.fn.myExtensionOtherMethod = function(){ 
    if(this._ext){ 
     //do something .. 
    } 
    return this; 
    }; 
}(jQuery)); 

//using .. 
$(document).ready(function(){ 
    $('#selector').myExtension({ 
    //options .. 
    }); 
    $('#selector').myExtensionOtherMethod(); 
}); 

quando invoco metodo $('#selector').myExtensionOtherMethod();, this non fa contiene this._ext variabile. So che questo è un altro ambito, ma so che c'è un modo per accedere a quella variabile in entrambi i metodi. Come posso farlo?

+0

Qual è il tuo obiettivo finale, vuoi una nuova istanza di myClass o opzioni per ogni elemento che corrisponde al selettore o una singola istanza di myClass che verrà utilizzata dall'estensione indipendentemente dall'elemento selezionato? –

+0

Stai creando un oggetto diverso ogni volta che usi '$ ('# selector')'. – charlietfl

+1

Cosa stai cercando di realizzare? L'uso di 'data()' sarà probabilmente d'aiuto – charlietfl

risposta

2

Questo non è davvero un problema di ambito. Questo perché il prototipo jQuery $.fn fornisce un oggetto jQuery come this. Anche se stai selezionando lo stesso elemento ogni volta che è un nuovo oggetto jQuery impostato come contesto in modo che la proprietà sia sparita. Puoi mettere quella proprietà sull'elemento DOM e ottenere il risultato desiderato.

(function($) { 
    var MyClass = function(opt) {}; 
    //one of the methods of my extension 
    $.fn.myExtension = function(opt) { 
     this[0]._ext = new MyClass(opt); 
     return this; 
    }; 
    $.fn.myExtensionOtherMethod = function() { 
     if (this[0]._ext) { 
      //do something .. 
     } 
     return this; 
    }; 
}(jQuery)); 

//using .. 
$(document).ready(function() { 
    $('#selector').myExtension({ 
     //options .. 
    }); 
    $('#selector').myExtensionOtherMethod(); 
}); 

Questo è solo un rapido esempio sopra. Se il tuo selettore trova più di un elemento dovresti eseguirne il ciclo. Ma ho solo afferrato il primo indice da quando stavi selezionando per ID.

Fiddle: https://jsfiddle.net/AtheistP3ace/gd1ehk0d/

Come accennato in precedenza da @charlietfl, sono d'accordo con quel commento. Felice di spiegare perché quello che hai fatto non ha funzionato, ma ci potrebbero essere modi migliori per ottenere ciò che stai cercando.