如何从其他范围访问小部件及其功能?

时间:2010-09-06 09:52:57

标签: jquery jquery-ui

我正在通过扩展对话框小部件来构建自定义jquery小部件。如何通过按钮按下事件功能访问小部件本身及其功能?

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

2 个答案:

答案 0 :(得分: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。不同之处显然是它不再是严格私密的,但如果其他人需要改变那个“确定”按钮的功能,你是否还想让它暴露?总体而言要记住一些事情,所以只是把它扔到那里。

答案 1 :(得分: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;
})());