2013-04-20 73 views
1

這只是一個簡單的問題,因爲我無法弄清楚這裏的實際問題,也許有人有更多的經驗來擴展jQuery UI部件。擴展jquery-ui菜單部件失敗,但它不應該

我試圖更改menu._close方法中的一些行爲,擴展Widget是這樣的:

(function($, undefined) { 
    $.widget('ui.menu', $.ui.menu, { 
     _close: function(startMenu) { 
      this._super('_close', startMenu) 
        console.log('extension works!') 
     } 
    }) 
} (jQuery)); 

至於我可以從我找到了消息來源告訴,這是正確的方式。但現在,問題是_super方法。它應該調用原始的menu._close方法,並且它 - 將唯一參數startMenu傳遞給它。但父方法失敗。

原來這裏是jQuery的UI menu._close方法的來源:

_close: function(startMenu) { 
    if (!startMenu) { 
     startMenu = this.active ? this.active.parent() : this.element; 
    } 

    startMenu 
     .find(".ui-menu") 
     .hide() 
     .attr("aria-hidden", "true") 
     .attr("aria-expanded", "false") 
     .end() 
     .find("a.ui-state-active") 
     .removeClass("ui-state-active"); 
} 

現在,它告訴我TypeError: startMenu.find is not a function,是的,這不是因爲this.element是不是一個實際的jQuery對象。但我的問題是,爲什麼?

我只擴展了這個方法,沒有改變任何功能,只在之後加入了一個調試程序,原來的方法被調用,只傳遞給它的參數。我在這裏做錯了什麼?

在此先感謝,祝你週末愉快!

回答

1

_super()已經知道它應該調用哪個基本方法,所以傳遞它的名字是多餘的。

你只需要編寫:

_close: function(startMenu) { 
    this._super(startMenu); 
    console.log("extension works!"); 
} 

在你當前的代碼,傳遞給基方法的第一個參數將是方法的名稱,而不是startMenu,這的確會導致基方法失敗。

+0

非常感謝!那麼,那麼我在本教程中遇到了一些問題:https://gist.github.com/scottgonzalez/962848這裏_super()方法使用'_create'作爲參數,所以我認爲它是需要的。 (我在別的地方查了'_super'方法,並且在那裏也記錄了這種方法),也許我讀過時的信息。 – Katai 2013-04-20 12:52:14

+0

@Katai,那個教程可能指的是以前的jQuery UI版本(從那時起widget工廠被改版了)。也就是說,即使是官方文檔也很奇怪(比如說'_super()'不接受參數)。我仔細檢查了當前的源代碼,該模式肯定是「不傳遞方法名稱,傳遞任何其他參數」。 – 2013-04-20 13:13:09