在coffeescript中编写jquery插件 - 如何获取"(function($)"和"(jQuery)"?

Pan*_*ood 36 javascript jquery coffeescript

我在coffeescript中编写了一个jquery插件,但我不确定如何使函数包装器部分正确.

我的coffeescript从这开始:

$.fn.extend({
    myplugin: ->
        @each ->
Run Code Online (Sandbox Code Playgroud)

哪个用函数包装器创建javascript:

(function() {
  $.fn.extend({
      myplugin: function() {
          return this.each(function() {
Run Code Online (Sandbox Code Playgroud)

但我希望像这样传入'$':

(function($) {
  $.fn.extend({
Run Code Online (Sandbox Code Playgroud)

类似于我的结局......在coffeescript中没有特别的.
我在javascript中得到这个:

})();
Run Code Online (Sandbox Code Playgroud)

但是想这样:

})(jQuery);
Run Code Online (Sandbox Code Playgroud)

有谁知道如何使用coffeescript编译器实现这一目标?或者在coffeescript中完成这项工作的最佳方法是什么?

jas*_*nas 54

答案是你不需要在CoffeeScript中调用它 - 你的脚本已经安全地包装在一个闭包中,因此不需要jQuery-pass-in-a-parameter-tricks.写吧:

$ = jQuery
Run Code Online (Sandbox Code Playgroud)

...在你的剧本的顶部,你很高兴去.


Tre*_*ham 19

除非您--bare在编译器中使用该标志,否则

$ = jQuery
Run Code Online (Sandbox Code Playgroud)

解决方案最好.如果你,那么使用new do关键字,你可以写

do ($ = jQuery) ->
   # plugin code...
Run Code Online (Sandbox Code Playgroud)

从而创造了所需的范围,同时避免了括号中的混乱.


Dar*_*ton 6

更新/编辑:是的,根据杰里米的解释:

$ = jQuery

$.fn.myPlugin = () ->
  console.log('test fired')
Run Code Online (Sandbox Code Playgroud)

编译为:

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

这作为一个jQuery插件工作得很好: $('body').myPlugin();

原版的:

好吧,我想我可能会接近这个,让我知道它是否有帮助.

(($) ->
  $.fn.extend =
    myplugin: ->
    @each: ->
)(jQuery)
Run Code Online (Sandbox Code Playgroud)

渲染成:

(function() {
  (function($) {
    return $.fn.extend = {
      myplugin: function() {},
      this.each: function() {}
    };
  })(jQuery);
}).call(this);
Run Code Online (Sandbox Code Playgroud)