Grails Bootstrap.js基于多个属性的下拉搜索

时间:2017-04-20 04:46:53

标签: jquery twitter-bootstrap grails

我是Grails的新手,并且一直试图弄清楚如何创建一个可搜索的选择,我可以通过select中的对象列表中的不同属性进行搜索。我正在使用Grails 2.4.3和Twitter Bootstrap。

我有一个对象列表 - ,它有2个属性,名称代码。我必须在下拉列表中显示项目名称,但可以按名称或代码进行搜索。

<g:if test="${items?.size() > 1}">
<g:select id="itemSelect"
              name="itemSelect"
              optionKey="id"
              from="${items.sort {it.name}}"
              optionValue="${{ "${it.name} / ${it.code}"}}"
              value="${item?.id}"
              class="form-control selectpicker"
              data-live-search="true"
              data-size="10" />
</g:if>

我想要的是

optionValue="${{ "${it.name} / ${it.code}"}}"

替换为

optionValue="${{ "${it.name}"}}"

但我仍然可以通过名称或代码进行搜索。目前,如果数据显示在optionValue中,我只能通过名称和代码进行搜索。

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

您可以使用Select2

你必须包含Select2 javascript和css文件,如下所示和jquery,我也使用bootstrap样式作为例子。

你正在将ajax调用回到控制器动作,该动作对2个字段进行过滤,在本例中我们使用条件在域对象上进行,不确定列表中的内容,我们返回结果为JSON。

您将获得一个搜索框,您的结果将会即时更新。

GSP:

<head>

    <link rel="stylesheet" href="/assets/bootstrap.css" />
    <link rel="stylesheet" href="/assets/select2.min.css" />

    <script type="text/javascript" src="/assets/jquery-2.2.0.min.js" ></script>
    <script type="text/javascript" src="/assets/bootstrap.js" ></script>
    <script type="text/javascript" src="/assets/select2.min.js" ></script>


    <script type="text/javascript">
        $( document ).ready( function() {
            $( "#itemSearch" ).select2({
                placeholder: "Search for an item...",
                ajax: {
                    url: "${g.createLink( controller: 'myController', action: 'listOfStuff')}",
                    dataType: 'json',
                    delay: 250,
                    data: function (params) {
                        return {
                            q: params.term // search term sent to action
                        };
                    },
                    processResults: function (data) {
                        return {
                            results: $.map(data, function (item) {
                                return {
                                    text: item.name,    // what'll be shown in the drop down list
                                    id: item.id
                                }
                            })
                        };
                    },
                    cache: true
                },
                minimumInputLength: 2
            });
        });
    </script>
</head>

<body>

    <g:form>
        <div class="form-group">
            <label class="col-sm-4 control-label">Item</label>
            <div class="col-sm-6">
                <select id="itemSearch" name="itemSearch" class="form-control">
                    <option>Initial option</option>
                </select>
            </div>
        </div>
    </g:form>

</body>

控制器:

def listOfStuff() {
    def ret = MyDomain.createCriteria().list {
        or {
            ilike("name", "%${params.q}%")
            ilike("code", "%${params.q}%")
        }
    }
    render ret as JSON
}