Schreiben eines JQuery -Plugins in Coffeescript - Wie bekomme ich "(Funktion ($)" und "(jQuery)"?
-
13-10-2019 - |
Frage
Ich schreibe ein JQuery -Plugin in CoffeeScript, bin mir jedoch nicht sicher, wie ich den Funktionsumschlüsselteil richtig machen kann.
Mein Coffeescript beginnt damit:
$.fn.extend({
myplugin: ->
@each ->
Dies erstellt das JavaScript mit einem Funktionsumschlag:
(function() {
$.fn.extend({
myplugin: function() {
return this.each(function() {
Aber ich möchte ein '$' wie folgt übergeben:
(function($) {
$.fn.extend({
Ähnlich für das Ende, das ich habe ... nichts Besonderes in Coffeescript.
Ich verstehe das in JavaScript:
})();
Aber würde das mögen:
})(jQuery);
Weiß jemand, wie man dies mit dem Coffeescript -Compiler erreicht? Oder was ist der beste Weg, dies in Coffeescript zu erledigen?
Lösung
Die Antwort ist, dass Sie es in CoffeeScript nicht so nennen müssen-Ihr Skript ist bereits sicher in einen Verschluss eingewickelt, sodass Sie nicht in einem A-A-Parameter-Tricks von JQuery-Passing-Passings erforderlich sind. Einfach schreiben:
$ = jQuery
... oben in Ihrem Drehbuch, und Sie können loslegen.
Andere Tipps
Es sei denn, Sie verwenden die --bare
Flagge im Compiler, die
$ = jQuery
Lösung ist am besten. Wenn du sind, dann mit dem neuen do
Schlüsselwort, Sie können schreiben
do ($ = jQuery) ->
# plugin code...
So erzeugen Sie den gewünschten Umfang und vermeiden Sie ein Chaos von Klammern.
Aktualisieren/Bearbeiten: Ja, laut Jeremys Erklärung:
$ = jQuery
$.fn.myPlugin = () ->
console.log('test fired')
kompiliert zu:
(function() {
var $;
$ = jQuery;
$.fn.myPlugin = function() {
return console.log('test fired');
};
}).call(this);
Was als JQuery -Plugin gut funktioniert: $('body').myPlugin();
Original:
Okay, ich denke, ich werde mich vielleicht nähern lassen, lassen Sie mich wissen, ob es hilft.
(($) ->
$.fn.extend =
myplugin: ->
@each: ->
)(jQuery)
rendert in:
(function() {
(function($) {
return $.fn.extend = {
myplugin: function() {},
this.each: function() {}
};
})(jQuery);
}).call(this);
Der einfachste Weg ist die Ausdehnung $ .fn Objekt
Einfaches JQuery -Plugin kann wie folgt in Coffeescript geschrieben werden:
$.extend $.fn,
disable: ->
@each ->
e = $(this)
e.attr("disabled", "disabled") if e.is("button") or e.is("input")
es wird zusammen kompilieren
(function() {
$.extend($.fn, {
disable: function() {
return this.each(function() {
var e;
e = $(this);
if (e.is("button") || e.is("input")) {
return e.attr("disabled", "disabled");
}
});
}
});
}).call(this);
Sie sollten einen Blick auf die CoffeeScript -Version von JQuery Boilerplate ~ werfen ~ https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.coffee
Obwohl dieser Beitrag alt ist, fand ich ihn nützlich. Hier ist der Kaffee-Skriptcode, der für mich funktioniert.
$ ->
$('.my-class').hello()
$.fn.hello=->
@each ->
$(@).append $ '<div>Hello</div>'
Notiz: Sie müssen das nicht deklarieren $
Variable, Sie können es einfach direkt aus der Box verwenden.
Sie könnten den Verschluss einfach selbst hinzufügen und sie mit dem kompilieren --bare
Flagge.
coffee -w -c --bare jquery.plugin.coffee
(($) ->
# some code here
)(jQuery)
Einfach und unkompliziert
Dies ist alles, was ich tun musste, um meine eigene Methode hinzuzufügen. cleanFadeIn
, auf jQuery -Objekten. Es gibt auch die Objekte zum Ketten zurück:
$.fn.extend
cleanFadeIn: -> # $('.notice').cleanFadeIn
return $(@).each -> # returns the objects for easy chaining.
$(@).slideDown 'slow', ->
$(@).fadeTo 'slow', 1