Created
September 3, 2012 17:01
-
-
Save rjz/3610858 to your computer and use it in GitHub Desktop.
Coffeescript jQuery Plugin Class Template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# A class-based template for jQuery plugins in Coffeescript | |
# | |
# $('.target').myPlugin({ paramA: 'not-foo' }); | |
# $('.target').myPlugin('myMethod', 'Hello, world'); | |
# | |
# Check out Alan Hogan's original jQuery plugin template: | |
# https://github.com/alanhogan/Coffeescript-jQuery-Plugin-Template | |
# | |
(($, window) -> | |
# Define the plugin class | |
class MyPlugin | |
defaults: | |
paramA: 'foo' | |
paramB: 'bar' | |
constructor: (el, options) -> | |
@options = $.extend({}, @defaults, options) | |
@$el = $(el) | |
# Additional plugin methods go here | |
myMethod: (echo) -> | |
@$el.html(@options.paramA + ': ' + echo) | |
# Define the plugin | |
$.fn.extend myPlugin: (option, args...) -> | |
@each -> | |
$this = $(this) | |
data = $this.data('myPlugin') | |
if !data | |
$this.data 'myPlugin', (data = new MyPlugin(this, option)) | |
if typeof option == 'string' | |
data[option].apply(data, args) | |
) window.jQuery, window |
+1 :)
+1 thank you!
fantastic thank you for putting this together!
+1 Great template! Thanks!
I have just a question, wouldn't it be better to attach the "myPlugin" data in the constructor and remove it inside a destroy method?
As I understand your code, it would be a bit akward if you want to allow the sequence
create -> destroy -> create
on the same DOM element because then the destroy method would need to remove the reference to data-myPlugin which is set outside the class if you want the second "create" to be executed.
Did I understand it right?
I would use the following to wrap the outer self-calling function.
do($ = window.jQuery, window) ->
# the rest of your code
That compiles to:
(function($, window) {
// the rest of your code
})(window.jQuery, window);
That feels more coffeescript-ish to me.
beautiful. thank you
Thanks!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
+1 thanks!