5

我对 jquery 很陌生,最近根据我的需要定制了jquery 组合框。但是,我需要在我网站的其他地方重用这个组件。我基本上需要传入一些参数和一个回调函数,应该调用它们来处理 jquery 中的某些事件。我在语法上苦苦挣扎,并试图找到 jquery 的做事方式:

为了给你一个样本,这里sourcecombobox -> input -> autocomplete -> source

(创建了一个工作jsfiddle以供参考)

source: function( request, response ) {
    // implements retrieving and filtering data from the select
    var term = request.term;
    var prefixLength = 2;
    if (term.length >= prefixLength) {
        var abbreviation = term.substring(0, prefixLength);

        if(!(abbreviation.toLowerCase() in cache)){
            cache[abbreviation.toLowerCase()] = 1;

            $.ajax({
                url: "/wah/destinationsJson.action",
                dataType: "json",
                data: {
                    term: abbreviation
                },
                type: "GET",
                success: function(data) {
                    if(!data || !data.cities || !data.cities.length){
                        // response(["No matches for " + term]);
                        return;
                    } 
                    updateOptions(select, data.cities);
                    response(filterOptionsForResponse(select, term));
                    return;
                }
            });
        }
    }

    response(filterOptionsForResponse(select, term));
}

在这里updateOptions(...)filterOptionsForResponse(select, term)是简单的 javascript 函数。

为了重用,我需要为source我创建的每个组合框实例指定一个回调来处理。

有人可以指出我如何做到这一点的正确方向吗?

4

1 回答 1

8

唯一有用的小部件工厂文档在 wiki中,上面写着

属性:
[...]
this.options
当前用于插件配置的选项。在实例化时,用户提供的任何选项都将自动与任何默认值合并

因此,如果您需要为 提供回调函数source,那么您会这样说:

$("#searchbox").combobox({
    source: function(request, response) { /* ... */ }
});

然后在你的插件里面,看看this.options.source

$.widget("ui.combobox", {
    options: {
        // Default options go here...
    },
    _create: function() {
        //...
        input = $("<input>").appendTo(wrapper).val(value).addClass("ui-state-default").autocomplete({
            source: this.options.source,
            //...

您不必包含默认选项,但这样做几乎总是有意义的(即使您只是将其用于文档目的)。

于 2012-06-01T06:48:04.600 回答