2016-11-16 18 views
2

我試圖擴展jQuery中的小部件小部件,以便它自動將某些html添加到選項卡上,新選項卡(由用戶觸發)或頁面加載(對於任何預先存在的選項卡)。通過使用常規選項卡小部件和一些自定義JavaScript函數,我能夠使所有這些工作在小部件的外部工作。但是,爲了使它更加模塊化,我希望這些函數成爲擴展小部件的成員函數。從該小部件中的.each()方法中訪問公共/私有方法的jQuery小部件

的Widget:

$.widget("custom.extendedTabs", $.ui.tabs, { 
    ,_addOptions: function($el) { 
     //add a "close" button and an "options" button on each tab on mouseover 
    } 
    ,_create: function() { 
     this.element.find("li").each(function(i,el){ 
      this._addOptions($(this)); 
     }); 
     return this._super(); 
    } 
    ,addTab: function() { 
     //handle tab creation 
     ........ 
     this._addOptions(<newlyCreatedliElement>); 
    } 
}); 

實例化:

$(".tabs").each(function(){ 
    $(this).extendedTabs(); 
}); 

樣品:

<div id="tabs1" class="tabs"> 
    <ul> 
    <li><a href="#tabs-1">Nunc tincidunt</a></li> 
    <li><a href="#tabs-2">Proin dolor</a></li> 
    </ul> 
    <div id="tabs-1"> 
    <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.</p> 
    </div> 
    <div id="tabs-2"> 
    <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus.</p> 
    </div> 
</div> 

<div id="tabs2" class="tabs"> 
    <ul> 
    <li><a href="#tabs-3">Nunc tincidunt</a></li> 
    </ul> 
    <div id="tabs-3"> 
    <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.</p> 
    </div> 
</div> 

問題:

基於測試我沒有問題直接從_create()調用this._addOptions()。但是,從_create()內的.each()調用它時,我沒有同樣的成功。試圖這樣做時,我收到this.addOptions is not a function作爲錯誤。

我知道.each()裏面的this表示迭代的實例元素本身,而不是調用它的父控件。但我認爲可能有某種方法可以引用名爲.each()的對象。

UPDATE:

我是能夠成功地取代.each()有以下幾點:

for (var el in this.element.find("li").toArray()) { 
    this._addOptions($(this.element.find("li").toArray()[el])); 
} 

感覺笨重,然而,我仍然會欣賞從別人的一些見解誰可能有清潔方法。

回答

0

我認爲是一種替代的解決方案 - 一個保留了jQuery .each()

,_create: function() { 
    var self=this; 
    this.element.find("li").each(function(i,el){ 
     self._addOptions($(this)); 
    }); 
    return this._super(); 
} 
相關問題