防止在传递参数时立即调用函数



我有下面的代码,它可以使用

var settings = trumbowyg.o.plugins.giphycrumbs;
settings = $.extend(true, {},
defaultOptions,
trumbowyg.o.plugins.giphycrumbs || {}
);
if(!settings.open_modal) {
settings.open_modal = function() {
$(settings.modal_selector).modal('show');
}
}
trumbowyg.addBtnDef('giphycrumbs', {
fn: settings.open_modal
});

其中,按下按钮时执行settings.open_modal

然而,我想在其他地方定义这个函数(在trumbowyg的plugins部分,而不是在插件本身中(,但要做到这一点,我需要能够向它传递一个选择器。我已经用类似的close_modal函数完成了这一操作,但我对open_modal函数有问题。

以下是我想如何定义函数的方式:

plugins: {
giphycrumbs: {
...
modal_selector: '#giphy_modal',
close_modal: function(selector) {
$(selector).modal('hide');
},
open_modal: function(selector) {
$(selector).modal('show');
}
},
}

这意味着我的addBtnDef调用将被更改为类似于:

trumbowyg.addBtnDef('giphycrumbs', {
fn: settings.open_modal(settings.modal_selector)
});

然而,这会导致函数在初始化时立即运行,而不是像在将选择器添加到函数之前那样等待按钮被按下。

我如何让这个代码在运行函数之前等待按钮被按下,就像我添加选择器之前一样?

这是解决这个问题的一种方法,不过我更喜欢一个不需要额外功能的更好的解决方案。

首先,在插件init的外部声明settings,并以与以前相同的方式为其分配设置。

var settings = null;
...
giphycrumbs: {
init: function (trumbowyg) {
settings = trumbowyg.o.plugins.giphycrumbs;
...

接下来,创建一个不使用任何参数的新函数,该函数只调用settings.open_modal(settings.modal_selector)

function run_open_modal() {
settings.open_modal(settings.modal_selector);
}

并在addBtnDef调用中调用该函数。

trumbowyg.addBtnDef('giphycrumbs', {
fn: run_open_modal
});

是否预先声明了open_mode?因为,如果不是,您可以将设置声明为:

if(!settings.open_modal) {
settings.open_modal = function(selector) {
selector= selector||settings.modal_selector.
$(selector).modal('show');
}
} 

所以,如果你可以重新定义它,让原始闭包接受一个选择器。如果不传递一个,则它将默认为其初始行为。

最新更新