Skip to content

Commit

Permalink
Widget: Added _super() and _superApply() methods. Fixes #6861 - Widge…
Browse files Browse the repository at this point in the history
…t: Add _super() and _superApply() for easy access to parent methods.
  • Loading branch information
scottgonzalez committed Jan 14, 2011
1 parent f711e36 commit 25dae41
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
53 changes: 53 additions & 0 deletions tests/unit/widget/widget_core.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}
Expand Down
14 changes: 12 additions & 2 deletions ui/jquery.ui.widget.js
Original file line number Diff line number Diff line change
Expand Up @@ -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++ ) {
Expand Down Expand Up @@ -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 ] );
Expand All @@ -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
Expand Down Expand Up @@ -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 )
Expand Down

0 comments on commit 25dae41

Please sign in to comment.