2012-03-14 89 views
0

隨着jQuery UI的小部件工廠模式(1.8),我無法找到控件對象本身,而在鼠標事件:jQuery UI小部件鼠標事件獲取Widget狀態?

$.widget('foo.myWidget', { 
    _create: function() { 
    var $container = this.element.wrap('<div class="ui-widget" />').parent(); // Create a widget container 
    $container.append('<div class="myWidgetControl" />'); // Add some clickable thing 
    $container.find('.myWidgetControl').on('mouseup.myWidget', this._handleClick); // Watch the mouse event 
    }, 
    options: { // Widget factory options object 
    secretKey: 'foobar' 
    }, 
    _handleClick: function(e) { 
    // User clicked on ".myWidgetControl" 
    // this == DOM element .myWidgetControl 
    // e == the jQuery event object 

    // I need to get options.secretKey; how do I find it?!? 
    } 
}); 

在上面的例子中,我該如何獲得「祕密密鑰」選項參數?鑑於該頁面上可能有多個此小部件實例,如何獲取用戶點擊的控件元素的正確實例?

的「小部件」的方法added in 1.8看起來可能是一個解決方案,但它需要知道什麼元素,用戶最初應用widget中:

$("#myDiv").myWidget("widget"); 

在這種情況下,你如何找到了什麼用戶最初設置爲這個小部件的實例的選擇器(示例中爲「#myDiv」)?

回答

0

發現在this blog post溶液(離開這個問題打開看看是否有更好的方法,雖然):

由於小部件開發,我知道的容器元素是什麼;因此,請使用jQuery Data cache來保存對小部件的引用,以便稍後查找它:

_create: function() { 
    /* existing code */ 
    var $container = this.element.wrap('<div class="ui-widget" />').parent(); 
    $container.data('widget', this); // Save for later 
}, 
_handleClick: function(e) { 
    var $container = $(this).parentsUntil('.ui-widget').parent(); // Traverse the tree to find the root element I saved the data for 
    var widget = $container.data('widget'); 
    alert(widget.options.secretKey); // Success! (Don't actually display your secretKey in an alert...) 
}