2009-04-13 5 views
0

ich mit einer jQuery-Plugin arbeite, die wie folgt aussieht:jquery Plugin, das nicht seine Konfigurations zwischen Instanzen nicht teilt

(function($){ 
    var options; 
    $.fn.main(opts){ 
     options = opts; 
     //rest of code 
    } 
    $.fn.otherFunc(){ 
     //does something with options 
    } 
}(jQuery)); 

Das Problem hier ist, dass, wenn ich mit diesem Plugin 5-mal auf der Seite, die Optionen Variable wird überschrieben, und so teilen alle 5 Instanzen diese Optionen. Das ist schlecht, ich möchte, dass jede Plugin-Instanz ihre eigene Konfiguration hat.

Gibt es einen nicht-hackish jQuery Weg, dies zu erreichen?

edit:

soll ich hinzufügen, dass ich zusätzlich Optionen auf $ (this) in $ .fn.main als expando etwas hackish in Betracht ziehen würde, weil $ .fn.otherFunc möglicherweise nicht auf dem heißen $ (this) von der Hauptfunktion, also hätte ich keinen Zugriff auf meine Sachen!

Antwort

2

Wenn Sie das gleiche Plugin mehrere Elemente anwenden möchten wie diese

$("#div1, #div2, #div3, #div4, #div5").main(opts); 

Sie sollten es mit verschiedenen Optionen in 5 verschiedenen Anrufe geteilt - das heißt:

var opts1 = {...}; 
$("#div1").main(opts1); 

var opts2 = {...}; 
$("#div2").main(opts2); 

// etc. 

Fügen Sie außerdem eine paraemter zu $.fn.otherFunc zu erhalten, welche Optionen Objekt sollte es funktionieren.

EDIT: wenn Sie nicht otherFunc von innen main() aufrufen, sollten Sie überlegen, warum Sie Optionen zwischen ihnen teilst. In diesem Fall könnten wir, wenn Sie Ihr ursprüngliches Problem veröffentlichen (d. H. Das Problem der realen Welt, das Sie lösen wollen), eine bessere Lösung anbieten als zwei verschiedene Plugins, die Optionen gemeinsam nutzen, anstatt sie zu einem einzigen zusammenzuführen.

1

Der Code in Ihrem Beispiel gegeben hatte Syntaxfehler, ich nehme an, dass dies besser funktioniert:

(function($){ 
    var options; 
    $.fn.main = function(opts){ 
     options = opts; 
     //rest of code 
     alert(options.text); 
    } 
    $.fn.otherFunc = function(){ 
     //does something with options 
    } 
})(jQuery); 

$('a:first').main({text:'txt'}); 
$('a:last').main({text:'some other text'}); 

In Ihrem Code, würde ich empfehlen die Optionen Daten an das DOM-Element hinzugefügt selbst den Überblick zu behalten Von den Optionen wird schließlich das "Verhalten" gesteuert, also ist es natürlich, es dort zu halten, nicht in einem separaten Objekt.

Verwandte Themen