diff options
author | Scott González <scott.gonzalez@gmail.com> | 2011-01-14 15:52:03 -0500 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2011-01-14 15:52:03 -0500 |
commit | 25dae411bc7bb0e618db4df062fa2f1c08bfcc77 (patch) | |
tree | 66b910c6c697491a4c47b4ebede9000c24f5d454 | |
parent | f711e362cd998f956a21d8e2ef455aca329fd0d7 (diff) | |
download | jquery-ui-25dae411bc7bb0e618db4df062fa2f1c08bfcc77.tar.gz jquery-ui-25dae411bc7bb0e618db4df062fa2f1c08bfcc77.zip |
Widget: Added _super() and _superApply() methods. Fixes #6861 - Widget: Add _super() and _superApply() for easy access to parent methods.
-rw-r--r-- | tests/unit/widget/widget_core.js | 53 | ||||
-rw-r--r-- | ui/jquery.ui.widget.js | 14 |
2 files changed, 65 insertions, 2 deletions
diff --git a/tests/unit/widget/widget_core.js b/tests/unit/widget/widget_core.js index c01cd6542..388e078b0 100644 --- a/tests/unit/widget/widget_core.js +++ b/tests/unit/widget/widget_core.js @@ -228,6 +228,59 @@ test( "re-init", function() { same( actions, [ "optionfoo", "init" ], "correct methods called on re-init with options" ); }); +test( "._super()", function() { + expect( 6 ); + var instance; + $.widget( "ui.testWidget", { + method: function( a, b ) { + same( this, instance, "this is correct in super widget" ); + same( a, 5, "parameter passed to super widget" ); + same( b, 10, "second parameter passed to super widget" ); + return a + b; + } + }); + + $.widget( "ui.testWidget2", $.ui.testWidget, { + method: function( a ) { + same( this, instance, "this is correct in widget" ); + same( a, 5, "parameter passed to widget" ); + var ret = this._super( "method", a, a*2 ); + same( ret, 15, "super returned value" ); + } + }); + + instance = $( "<div>" ).testWidget2().data( "testWidget2" ); + instance.method( 5 ); + delete $.ui.testWidget2; +}); + +test( "._superApply()", function() { + expect( 7 ); + var instance; + $.widget( "ui.testWidget", { + method: function( a, b ) { + same( this, instance, "this is correct in super widget" ); + same( a, 5, "parameter passed to super widget" ); + same( b, 10, "second parameter passed to super widget" ); + return a + b; + } + }); + + $.widget( "ui.testWidget2", $.ui.testWidget, { + method: function( a, b ) { + same( this, instance, "this is correct in widget" ); + same( a, 5, "parameter passed to widget" ); + same( b, 10, "second parameter passed to widget" ); + var ret = this._superApply( "method", arguments ); + same( ret, 15, "super returned value" ); + } + }); + + instance = $( "<div>" ).testWidget2().data( "testWidget2" ); + instance.method( 5, 10 ); + delete $.ui.testWidget2; +}); + test( ".option() - getter", function() { $.widget( "ui.testWidget", { _create: function() {} diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js index 82b88ea71..444367423 100644 --- a/ui/jquery.ui.widget.js +++ b/ui/jquery.ui.widget.js @@ -9,6 +9,8 @@ */ (function( $, undefined ) { +var slice = Array.prototype.slice; + var _cleanData = $.cleanData; $.cleanData = function( elems ) { for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { @@ -50,7 +52,8 @@ $.widget = function( name, base, prototype ) { namespace: namespace, widgetName: name, widgetEventPrefix: name, - widgetBaseClass: fullName + widgetBaseClass: fullName, + base: base.prototype }, prototype ); $.widget.bridge( name, $[ namespace ][ name ] ); @@ -59,7 +62,7 @@ $.widget = function( name, base, prototype ) { $.widget.bridge = function( name, object ) { $.fn[ name ] = function( options ) { var isMethodCall = typeof options === "string", - args = Array.prototype.slice.call( arguments, 1 ), + args = slice.call( arguments, 1 ), returnValue = this; // allow multiple hashes to be passed on init @@ -141,6 +144,13 @@ $.Widget.prototype = { _create: function() {}, _init: function() {}, + _super: function( method ) { + return this.base[ method ].apply( this, slice.call( arguments, 1 ) ); + }, + _superApply: function( method, args ) { + return this.base[ method ].apply( this, args ); + }, + destroy: function() { this.element .unbind( "." + this.widgetName ) |