Написание jquery-плагина в coffeescript - как получить "(function ($)" и "(jQuery)"?

Я пишу плагин jquery в coffeescript, но не уверен, как правильно получить часть обертки функции.

Мой кофейник начинается с этого:

$.fn.extend({
    myplugin: ->
        @each ->

Что создает javascript с помощью обертки функции:

(function() {
  $.fn.extend({
      myplugin: function() {
          return this.each(function() {

но я хочу, чтобы '$' передавался следующим образом:

(function($) {
  $.fn.extend({

Аналогично для окончания у меня... ничего особенно в coffeescript.
Я получаю это в javascript:

})();

Но хотелось бы:

})(jQuery);

Кто-нибудь знает, как добиться этого с помощью компилятора coffeescript? Или что это лучший способ сделать это в coffeescript?

Ответ 1

Ответ заключается в том, что вам не нужно так называть его в CoffeeScript - ваш script уже безопасно завернут в закрытие, поэтому нет необходимости в jQuery-pass-in-as-a-parameter- трюки. Просто напишите:

$ = jQuery

... вверху вашего script, и вам хорошо идти.

Ответ 2

Если вы не используете флаг --bare в компиляторе,

$ = jQuery

лучше. Если вы, то с новым do ключевым словом, вы можете написать

do ($ = jQuery) ->
   # plugin code...

создавая тем самым требуемую область видимости, избегая беспорядочных круглых скобок.

Ответ 3

UPDATE/EDIT: Да, согласно объяснению Джереми:

$ = jQuery

$.fn.myPlugin = () ->
  console.log('test fired')

скомпилируется:

(function() {
  var $;
  $ = jQuery;
  $.fn.myPlugin = function() {
    return console.log('test fired');
  };
}).call(this);

Что работает просто как плагин jQuery: $('body').myPlugin();

Оригинал:

Хорошо, я думаю, что могу приблизиться к этому, дайте мне знать, если это поможет.

(($) ->
  $.fn.extend =
    myplugin: ->
    @each: ->
)(jQuery)

относится к:

(function() {
  (function($) {
    return $.fn.extend = {
      myplugin: function() {},
      this.each: function() {}
    };
  })(jQuery);
}).call(this);

Ответ 4

Самый простой способ - расширить $. fn объект

Простой плагин jQuery можно записать в CoffeeScript следующим образом:

$.extend $.fn,

  disable: ->
    @each ->
      e = $(this)
      e.attr("disabled", "disabled") if e.is("button") or e.is("input")

он скомпилируется в

(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);

Ответ 6

Хотя этот пост старый, я нашел его полезным. Вот код кофе script, который работает для меня.

$ -> 
    $('.my-class').hello()

$.fn.hello=-> 
    @each -> 
        $(@).append $ '<div>Hello</div>'

Примечание. Вам не нужно объявлять переменную $, вы можете просто использовать ее прямо из коробки.

Ответ 7

Вы можете просто добавить закрытие самостоятельно и скомпилировать его с помощью флага --bare.

coffee -w -c --bare jquery.plugin.coffee

(($) ->
  # some code here
)(jQuery)

Ответ 8

Простой и прямой

Это все, что я должен был сделать, чтобы добавить свой собственный метод cleanFadeIn в объекты jQuery. Он также возвращает объекты для цепочки:

$.fn.extend
  cleanFadeIn: ->                     # $('.notice').cleanFadeIn
    return $(@).each ->               # returns the objects for easy chaining.
      $(@).slideDown 'slow', ->
        $(@).fadeTo 'slow', 1