Herede los widgets de jQuery y llama al método de algún widget base desde afuera

Tengo dos widgets de jQuery, el Widget A es el básico y el Widget B hereda el Widget A.

Widget A:

$(function () { $.widget("custom.widgetA", { _create: function () { this.element .addClass('ui-widget-a') .append( $(document.createElement('div')).text('Widget A') ); }, someMethod: function() { return 'widget A'; } }); }(jQuery)); 

Widget B:

 $(function () { $.widget("custom.widgetB", $.custom.widgetA, { _create: function () { this.element .addClass('ui-widget-b') .append( $(document.createElement('div')).text('Widget B') ); this._super(); }, someOtherMethod: function() { return 'widget B'; } }); }(jQuery)); 

Que aplico Widget B a algún elemento HTML

 $('#widgetB').widgetB(); 

y ahora quiero llamar al método someMethod desde el widget A … para hacer esto, uso este código

 $('#widgetB').widgetA('someMethod') 

pero recibe el mensaje de error

no se pueden llamar a métodos en widgetA antes de la inicialización; Intenté llamar método ‘someMethod’

Sé que si lo llamo así funcionará.

 $('#widgetB').widgetB('someMethod') 

pero necesito llamarlo usando el widget base … ¿es posible hacerlo?

Aquí está el violín con mi ejemplo.

ACTUALIZAR

La razón por la que sucede de esta manera aquí.

Realmente no hay nada que le impida init ambos widgets en el mismo elemento:

 $.widget("custom.widgetB", $.custom.widgetA, { _create: function () { this._super(); $(this.element).widgetA(this.options); } }); 

Ahora puedes llamar a ambos:

 $('#widgetB').widgetA('someMethod'); $('#widgetB').widgetB('someMethod'); 

En su caso, la función de creación en realidad crea nuevos elementos (que tienen una jQuery shorthand $("

")

), por lo que tendría que incluir solo uno de los iniciadores de init anteriores para el widgetA es decir. solo uno de this._super() o $(this.element).widgetA()

Actualización de violín


Esto puede llevar a cierta complejidad adicional si está almacenando objetos no primitivos en la instancia de widgetA , pero con este modelo probablemente no debería estar haciendo eso en primer lugar