Написание 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);
Ответ 5
Вы должны взглянуть на версию CoffeeScript jQuery Boilerplate ~ https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.coffee
Ответ 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