2014-09-02 43 views
0

一些基本小部件的方法我有两个jQuery的窗口小部件,小工具A是基一个和所述窗口小部件乙继承的widget A.继承jQuery的窗口小部件,并调用从外部

小窗口的:

$(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乙:

$(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)); 

比我申请的Widget B到一些HTML元素

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

,现在我想从控件的调用方法someMethod ......为了做到这一点我用这个代码

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

,但得到的错误信息

不能调用之前widgetA方法初始化;试图 调用方法“的someMethod”

我知道如果我把它叫做这样它会工作

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

,但我需要使用基本控件调用它......可能吗?

这里是fiddle用我的例子

UPDATE

为什么会发生这样的原因here

回答

1

确实没有什么阻止你init在相同的元素荷兰国际集团两个部件:

$.widget("custom.widgetB", $.custom.widgetA, { 

    _create: function() { 
     this._super(); 
     $(this.element).widgetA(this.options); 
    } 
}); 

现在,您可以同时调用:

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

在你的情况下,创建函数实际上创造了新的元素(其中有一个jQuery的速记$("<div>")),所以你必须只包括上述init ializers为widgetA即之一。只有this._super()一个或$(this.element).widgetA()

Fiddle update


这可能会导致一些额外的复杂性,如果你存储在widgetA实例非原始对象,但这种模式,你可能不应该做那首先是

+0

是的,我也在想它......但这是一个因素,阻止我从这个解决方案...在这种情况下,从窗口小部件_create方法将被调用两次。这就是为什么我认为这不是最佳解决方案,应该有更好的解决方法。 – 2014-09-02 10:58:34

+0

好吧,经过一番思考......如果从小部件B中删除this._super()_create方法,并且只留下this.element.widgetA(this.options)它将解决问题,并且将从小部件A调用_create方法只有一次。请更新您的代码,我会接受它。感谢您的想法! – 2014-09-02 11:14:36

+0

@AlexWheat这就是我的意思是“只包括一个初始者”,这就是小提琴。以上片段只是概念:) – blgt 2014-09-02 12:07:39