我正在通过扩展对话框小部件来构建自定义jquery小部件。如何通过按钮按下事件功能访问小部件本身及其功能?
$.widget("ui.ImageLibrary", $.ui.dialog, {
options: {
title:'Choose Image',
buttons:{
"Ok":function(){
// How can I access _somePrivateFunction here?
},
"Close":function(){
//
}
}
},
_somePrivateFunction: function(){
},
...
答案 0 :(得分:4)
您可以通过访问创建此小部件实例时存储的副本来访问该功能,如下所示:
"Ok":function(){
$.data(this, "ImageLibrary")._somePrivateFunction.call(this);
}
另一种方法,如果它是一个选项,是通过发生的小部件桥接使其可访问(如果人们覆盖按钮参数,它仍然需要可访问),如下所示:
$.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;
})());