mysql - g :select using two combobox in grails

标签 mysql grails spring-security

您好,我正在尝试使用两个下拉组合框列出商店。如果您没有选择国家或城市,请列出所有商店。根据城市国家或两者的其他方式列表。顺便说一句,我没有创建 Controller ,而是使用 generate-all 生成 tehm。 这是我的观点;

 <g:form action="index" method="POST">
            <div class="fieldcontain">
                <g:select name="ddlCountry" noSelection="[null:message(code:'default.select.label',default:'Seçiniz...')]"
                from="['UK', 'NL', 'DE']"
                value="${params.ddlCountry}"/>
                <g:select name="ddlCity"
                          from="['AMSTERDAM', 'Erfurt', 'Manchester','London']"
                          value="${params.ddlCity}"/>

                <input class="btn btn-danger" type="submit" value="Listele" />
                <g:each in="${shopList}" status="i" var="shopInstance">
                    <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                        <td>
                            <g:link controller="shop" action="show"  params="[id:shopInstance.id]">
                                ${fieldValue(bean: shopInstance, field: "shopName")}
                            </g:link>
                        </td>
                        <td>${fieldValue(bean: shopInstance, field: "shopAdress1")}</td>
                        <td>${fieldValue(bean: shopInstance, field: "shopPostcode")}</td>
                        <td>${fieldValue(bean: shopInstance, field: "shopCity")}</td>
                        <td>${fieldValue(bean: shopInstance, field: "shopCountry")}</td>
                        <td>${fieldValue(bean: shopInstance, field: "shopDateEdited")}</td>

                    </tr>
                </g:each>
            </div>
        </g:form>

这是商店 Controller 索引

def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    if(params.ddlCountry  || params.ddlCity) {
        def shops = Shop.withCriteria {
            if (params.ddlCountry) {
                like('shopCountry', '%${params.ddlCountry}%')
            }
            if (params.ddlCity) {
                like('shopCity', '%${params.ddlCity}%')
            }

        }
        [shopList:shops]
    }
    else{
        respond Shop.list(params), model:[shopCount: Shop.count()]
    }


}

它每次都会列出所有商店。当我点击按钮页面刷新但没有任何反应

最佳答案

看来还有很多东西要学:

在名为 _index.gsp 的 myController 文件夹中创建一个新模板/文件 把这个放在里面

   <g:each in="${shopList}" status="i" var="shopInstance">
                        <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                            <td>
                                <g:link controller="shop" action="show"  params="[id:shopInstance.id]">
                                    ${fieldValue(bean: shopInstance, field: "shopName")}
                                </g:link>
                            </td>
                            <td>${fieldValue(bean: shopInstance, field: "shopAdress1")}</td>
                            <td>${fieldValue(bean: shopInstance, field: "shopPostcode")}</td>
                            <td>${fieldValue(bean: shopInstance, field: "shopCity")}</td>
                            <td>${fieldValue(bean: shopInstance, field: "shopCountry")}</td>
                            <td>${fieldValue(bean: shopInstance, field: "shopDateEdited")}</td>

                        </tr>
                    </g:each>

将此更改为:

            <!-- add onChange function to select you could look up item on change through jquery instead-->
            <g:select name="ddlCity"
                      from="['AMSTERDAM', 'Erfurt', 'Manchester','London']"
                      value="${params.ddlCity}" onChange="verifyCity(this.value)"/>

            <input class="btn btn-danger" type="submit" value="Listele" />
            <!-- put a wrapper div ID around actual results -->
            <div id="results">
            <!-- make it render template now the controller action renders same content for this bit -->
            <g:render template="/myController/index" />
            </div>
            <!-- END Wrapper -->
        </div>


        <script>
        //Write some java script to handle the actions clicked

        //VerifyCity will work on city click
        //Hopefully this should be all it needs it gets a value builds a data array passes it to load results
        function verifyCity(value) {
        //
            var data={ddlCity:value}
            loadResults(data);
        }

        //Same as above for country
        function verifyCountry(value) {
            var data={ddlCountry:value}
            loadResults(data);
        }

        //This runs a jquery post to the CONTROLLERNAME - define this and your action
        //when it has a success it updates results DIV with the content
        function loadResults(data) {
            $.ajax({timeout:1000,cache:true,type: 'post',url: "${g.createLink(controller: 'CONTROLLERNAME', action: 'index')}",
            data:data,
            success: function(output) {
                $('#results').html(output);
            }
        });
        </script>               

显示结果的片段现在在它自己的模板中,当它正常呈现时它调用模板。当进行 ajax 调用时,它会呈现该特定模板。

现在对您的 Controller 进行一些更改

def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)

    if(params.ddlCountry  || params.ddlCity) {
        def shops = Shop.withCriteria {
            if (params.ddlCountry) {
                like('shopCountry', '%${params.ddlCountry}%')
            }
            if (params.ddlCity) {
                like('shopCity', '%${params.ddlCity}%')
            }

        }
        //If request is coming in via ajax load in a template of the actual results so the bit that is within div id='results' should be actually a template.       
        if (request.xhr) {
           render (template: 'myController/index', model:[shopList:shops])
            return
        } 
        //This will handle non ajax calls and will load in the index.gsp which includes the site mesh
        [shopList:shops]
        return
    }

   //no need for else just use return to stop a if statement in a controller
    respond Shop.list(params), model:[shopCount: Shop.count()]
    return
}

除了 if if (request.xhr) 告诉 Controller 这是一个 ajax 调用呈现模板 _index.gsp 而不是 index.gsp

这两者之间的区别在于 index.gsp 有 layout="main"这是加载站点样式的站点网格。该模板是普通的,可以重载呈现的现有普通页面的一部分。

关于mysql - g :select using two combobox in grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848049/

相关文章:

mysql - 根据主表的一个属性将数据输入到具有外键关系的2个表中

Mysql 和 LDML(附加字符与 latin1 相同)

php - 在 php 中创建嵌套组时打破循环

grails - 具有自定义多对多关系,带有参数的关系表的Grails

Grails 为映射的 Url 提供 404

javascript - JS中获取JSESSIONID cookie值

mysql - 在 COUNT(*) 条件 MySQL 中添加一个 WHERE

jquery - Grails-自动完成,接收列表,最简单的方法2014

java - Spring 安全中的 Oauth2 客户端

java - 用户详细信息存储最佳实践