如何在ajax查询后将项添加到组合框?

时间:2012-07-24 13:30:11

标签: jquery autocomplete combobox

我无法找到解决问题的方法。我有使用JqueryUI给出的组合框示例。

我的源代码是Json Ajax,所有这些都运行良好。但是我想手动将一个项目添加到我的组合框(我想将它附加到Ajax项目),这些项目说“添加一个新项目”,当我点击它时,我的模态形式变得可见。

我在代码中添加了一些评论,我需要帮助来解释我的问题。

 $('#combobox_scenario').combobox({
    source: function( request, response ) {
        $.ajax({
            url: "?module=gestionApplication&action=getListeScenarios&option="+encodeURI($(".ui-combobox:first input").val()),
            dataType: "json",
            success: function( data ) {
                response( $.map( data, function( item ) {
                    return {
                        label: item.test,
                        value: item.test,
                        option: this
                    }
                }));
                //I want to add an item Here !
                //response.add({label: 'Ajouter un Scénario',value: 'Ajouter un Scénario',option : this});
                console.log(response);
            }
        });
    },
    selected: function(event, ui) {
        var scenario = ui.item2;
        //if (scenario = "This Item added manually") 
            //MyForm.show()
        //else
            $.ajax({
                url: "?module=gestionApplication&action=getScenario&option="+encodeURI(scenario),
                dataType: "json",
                success: function( data ) {
                    data = data[0];
                    $("#scenario").show();
                    $("#scenario").html('<hr><h2>Informations sur le scénario '+data.TEST+'</h2><p>Description : '+data.DESCRIPTION+'</p>'+'<p>Application : '+data.APPLICATION+'</p>');
                }
            });
        //EndIf
    }
});

修改

这是我的自动完成组合框代码:

(function( $ ) {
$.widget( "ui.combobox", {
    _create: function() {
        var input,
            self = this,
            source = this.options,
            select = this.element.hide(),
            selected = select.children( ":selected" ),
            value = selected.val() ? selected.text() : "",
            wrapper = this.wrapper = $( "<span>" )
                .addClass( "ui-combobox" )
                .insertAfter( select );
        input = $( "<input>" )
            .appendTo( wrapper )
            .val( value )
            .addClass( "ui-state-default ui-combobox-input" )
            .autocomplete({
                delay: 0,
                minLength: 0,

                // Need define source in my main js
                source: this.options.source,
                select: function( event, ui ) {
                    ui.item.option.selected = true;
                    self._trigger( "selected", event, {
                        item: ui.item.option,
                        item2 : ui.item.label
                    });
                },
                change: function( event, ui ) {
                    if ( !ui.item ) {

                        var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ),
                            valid = false;
                        select.children( "option" ).each(function() {
                            if ( $( this ).text().match( matcher ) ) {
                                this.selected = valid = true;
                                return false;
                            }
                        });
                        if ( !valid ) {
                            // remove invalid value, as it didn't match anything
                            $( this ).val( "" );
                            select.val( "" );
                            input.data( "autocomplete" ).term = "";
                            return false;
                        }
                    }
                }
            })
            .addClass( "ui-widget ui-widget-content ui-corner-left" );

        input.data( "autocomplete" )._renderItem = function( ul, item ) {
            return $( "<li></li>" )
                .data( "item.autocomplete", item )
                .append( "<a>" + item.label + "</a>" )
                .appendTo( ul );
        };

        $( "<a>" )
            .attr( "tabIndex", -1 )
            .attr( "title", "Show All Items" )
            .appendTo( wrapper )
            .button({
                icons: {
                    primary: "ui-icon-triangle-1-s"
                },
                text: false
            })
            .removeClass( "ui-corner-all" )
            .addClass( "ui-corner-right ui-combobox-toggle" )
            .click(function() {
                // close if already visible
                if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                    input.autocomplete( "close" );
                    return;
                }

                // work around a bug (likely same cause as #5265)
                $( this ).blur();

                // pass empty string as value to search for, displaying all results
                input.autocomplete( "search", "" );
                input.focus();
            });
    },

    destroy: function() {
        this.wrapper.remove();
        this.element.show();
        $.Widget.prototype.destroy.call( this );
    }
});
})( jQuery );

1 个答案:

答案 0 :(得分:3)

新答案

在考虑了你的要求之后,我更新了我的答案。请注意,我使用JQuery UI example代码作为基础。

我对组合框小部件进行了三处更改:

<强> 1。修改您的ajax成功功能以添加“添加新项目”项

var responseContainer = $.map( data, function( item ) {
    return {
        label: item.test,
        value: item.test,
        option: this
    };
})
responseContainer.push({label:'ADD NEW ITEM',value:'ADD NEW ITEM',option:this});
response(responseContainer);

<强> 2。在ui-menu-item元素中输出标准html而不是     使用<strong>标记将文本拆分。

第3。在自动填充选择事件中添加了if语句

if(ui.item.value == "ADD NEW ITEM") {
    $("#dialog").dialog();
    $( this ).val( "" );
    select.val( "" );
    input.data( "autocomplete" ).term = "";
    return false;
}        

说明:因此,当选择某个项目时,会检查其值是否显示“添加新项目”。如果是,我们会显示一个对话框并将组合框重置为默认值。

Full code example using original JQuery UI widget (JSFiddle)

请注意 ,我们正在编辑小部件,因此如果您将其用于其他任何内容,这可能不是最佳选择。如果我有更多的时间,我会在没有编辑小部件的情况下寻找方法,但是时间很短。


原始答案

使用JQuery Append()

追加

要添加选项元素,请使用JQuerys的append()函数:

$('select#combobox_scenario').append('<option id="Combobox_Item_AddNewItem" value="Combobox_Item_AddNewItem">ADD A NEW ITEM</option>');

这会将给定的html附加到父元素的末尾,即在结束标记之前:...</select>

以下是append()

上的文档

或直接添加到元素

另一种方法是将选项添加到html中的选择列表中。像这样:

<select>
    // ...
    <option id="Combobox_Item_AddNewItem" value="Combobox_Item_AddNewItem">ADD A NEW ITEM</option>
</select>

这个问题是你通过ajax获得的值很可能会在之前附加

然后,在选择时显示对话框

然后你想在选择元素时显示一个对话框?好的,在下一行(添加新选项元素之后),也添加它:

$("#Combobox_Item_AddNewItem").live("click", function() {

    // Call the dialog ...
    $( "#AddNewItemDialog").dialog();
});