2010-09-06 2 views
4

Я создаю пользовательские виджеты jquery, расширяя виджет диалогового окна. Как я могу получить доступ к самому виджету и его функциям из функции события нажатия кнопки?Как я могу получить доступ к виджету и его функциям из других областей?

$.widget("ui.ImageLibrary", $.ui.dialog, { 
    options: { 
    title:'Choose Image', 
    buttons:{ 
     "Ok":function(){ 
     // How can I access _somePrivateFunction here? 
     }, 
     "Close":function(){ 
     // 
     }  
    } 
    }, 
    _somePrivateFunction: function(){ 
    }, 
    ... 

ответ

4

Вы можете получить доступ к функции путем доступа к копии, которая хранится при создании этого экземпляра виджета, как это:

"Ok":function(){ 
    $.data(this, "ImageLibrary")._somePrivateFunction.call(this); 
} 

You can give it a try here.

Другой метод, если это вариант, чтобы сделать его доступным через виджет мостиков, что происходит (если люди подменяют аргументы кнопки, то нужно будет, чтобы быть доступным в любом случае), как это:

$.widget("ui.ImageLibrary", $.ui.dialog, { 
    options: { 
    title:'Choose Image', 
    buttons:{ 
     "Ok":function(){ 
     $(this).ImageLibrary("someFunction"); 
     }, 
     "Close":function(){ 
     $(this).ImageLibrary("close"); 
     }  
    } 
    }, 
    someFunction: function(){ 
    alert("test"); 
    } 
}); 

You can give it a try here. Разница, очевидно, не является строго частной, но если кто-то еще должен изменить то, что делает эта кнопка «ok», возможно, вы захотите, чтобы она была выставлена ​​в любом случае? Что-то иметь в виду в целом, так что просто бросать это там.

+0

спасибо, прекрасный ответ. – codez

1

Согласно this tutorial, один из вариантов является использование this:

"Ok": function() { 
    this._somePrivateFunction(): 
} 

(В комментарий ниже codez говорит выше не работает, я должен иметь СУИ-обезжиренное Однако, ниже.)

Другой вариант для действительно частными функциями, однако, было бы использование функции определения области охвата (закрытия) и локальных вызовов. Это также установило бы вас use named functions rather than anonymous ones, что полезно для отладки. Пример:

$.widget("ui.ImageLibrary", $.ui.dialog, (function(){ 
             // ^-- This is the scoping function 
    var pubs = {}; // Our public symbols 

    pubs.options = { 
     title:'Choose Image', 
     buttons:{ 
      "Ok": myWidgetOkClickHandler, 
      "Close": myWidgetCloseClickHandler 
     } 
    }; 

    function myWidgetOkClickHandler() { 
     // Call your truly private function, ensure `this` is 
     // set correctly (or just code trulyPrivateFunction to 
     // expect it as an argument instead, aka procedural 
     // programming) 
     trulyPrivateFunction.call(this); 
    } 

    function myWidgetCloseClickHandler() { 
    } 

    function trulyPrivateFunction() { 
    } 

    // Don't forget this! 
    return pubs; 
})()); 
+0

Нет, в этом случае это будет ссылка на элемент диалога, но не на экземпляр виджета. – codez

+0

@codez: Ах, хорошо, я, должно быть, неправильно просмотрел этот учебник. Тогда второй вариант, который я добавил, когда вы комментируете, - это путь. :-) (Для меня это путь * в любом случае * ...) –

Смежные вопросы