【问题标题】:Calling controller function from gsp从 gsp 调用控制器函数
【发布时间】:2016-02-11 15:51:45
【问题描述】:

我需要从我的 gsp 上的 javascript 调用一个控制器函数。 我从数百个地方阅读了不同的解决方案,但没有一个有效。 我发现最接近我的问题是this。 但我没有重复与此相同的错误,因此解决方案没有帮助。

我有一个这样的标签,它调用 javascript 函数

<g:select name="poNumber" noSelection="['':'Select PO Number']" from="${com.rerq.PurchaseOrder.list()}" 
                    onchange="getProject(this.value)" />

而javascript函数看起来像这样

function getProject(poNumber){
        var projectName = document.getElementById("projectName");
        var newData = ${remoteFunction(controller: 'sow', action: 'getProject', params: ['poNumber':poNumber])};
}

而我需要调用的函数是

def getProject(String poNumber) {
        String projectName = Sow.find("from Sow as s where s.poNumber=?", [poNumber])
        return projectName
    }

控制器功能可能有错误,因为我对 groovy 和 grails 完全陌生。但我的理解是控制没有到达这里,所以这不应该是任何问题的原因。

我遇到了异常

没有方法签名:remoteFunction() 适用于参数类型:(java.util.LinkedHashMap) 值:[[controller:sow, action:getProject, params:[poNumber:null]]]

我尝试在 g:select 中使用 remoteFunction(),但它抛出了另一个异常

属性值引号未闭合...

即使他们是。

非常感谢任何帮助。

【问题讨论】:

  • 您使用的是哪个版本的 Grails?如果是 Grails 3,是否安装了 ajax-tags 插件?见stackoverflow.com/questions/34979604/…
  • 我正在使用 3.0.9 并安装 ajax-tags 删除了异常。虽然我改变了方法,因为还有其他问题。无论如何,谢谢你的帮助。如果您可以将其发布为答案,我会接受。

标签: javascript jquery grails groovy


【解决方案1】:

要在 Grails 3 中使用 remoteFunction,您需要添加 ajax-tags 插件:org.grails.plugins:ajax-tags:1.0.0

【讨论】:

    【解决方案2】:

    实际上,如果脚本在 gsp 中,并且您的 js 所需的任何东西都是在服务器端创建的,那么您可以让 gsp 识别 js 中的一些 Grails 函数。在您的情况下,您似乎想要进行 ajax 调用,以便您可以进行以下操作。

    project.gsp(假设你已经加载了 jQuery)

    <g:select name="poNumber" noSelection="['':'Select PO Number']" from="${com.impetus.rerq.PurchaseOrder.list()}" 
                        onchange="getProject(this.value)" />
    

    在同一个文件中

    <script type="text/javascript">
    
        function getProject(poNumber){
        jQuery("#yourTarget").load("${createLink(action: 'getProject')}",{poNumber: poNUmber},function(response, status, xhr ){
                       if ( status == "error" ) {
                           alert("No data loaded.")
                       }
                    });
        }
    
    </script>
    

    如您所见,使用了load("${}",... 中的 gstring,因为它将在服务器中解析,而在客户端,您的实际 js 将解析为 load("yourcontrollerName/getProject",....。为什么不直接在js中编码url呢?因为使用createLink() 更不容易出现引用错误。

    编辑

    如果您想这样做但使用外部 js 文件,则需要一种将 url 传递给 js 的方法,并使用简单的加载函数。所以这样的事情会有所帮助

    <g:select name="poNumber" noSelection="['':'Select PO Number']" from="${com.impetus.rerq.PurchaseOrder.list()}" 
                            onchange="getProject(this.value, \'${createLink(action:'getProject')}\')" />
    

    一旦在服务器上onchange="getProject(this.value,\'${createLink(action:'getProject')}\')" 将被解析为onchange="getProject(this.value,'yourController/getProject')"。请注意我可能弄乱了 ""s 和 's 所以验证你的 html 输出。 你需要一个接受uri的js函数

    function getProject(value, targetUri){
    ....
    }
    

    你需要检查的是什么时候需要你的函数,在客户端的服务器上;函数是否在 gsp 中;如果不可用,您如何将数据传递给他们。

    【讨论】:

    • 我没有加载 jquery。我正在尝试通过将其添加到构建文件来做到这一点-运行时“org.grails.plugins:jquery:1.11.1”编译“org.grails.plugins:jquery-ui:1.10.4”并将其添加到 gsp 文件中 和下面的 config.groovy grails.views.javascript.library="jquery" 但是构建失败,我无法运行该应用程序。难道我的做法不对吗?
    • 您可以直接将其添加到主布局的 中,例如 。 src 是 https : //code.jquery.com/jquery-1.12.0.min.js 减去空格。
    • 还要检查如何使用资源插件或更少的资产管道插件来完成。我认为只为 jquery 添加一个完整的插件是一种矫枉过正。
    【解决方案3】:

    您无法从javascript 访问grails's controller。我还没有测试过,但这可能有效。

    <g:createLink controller="sow" action="getProject", params="['poNumber':poNumber]"/>
    

    另外,如果您使用 Google Chrome 的开发者工具,您将看到您的javascript 代码是如何显示的。确保它的语法正确。

    【讨论】:

    • 还有 所以在javascript中它会是 ${g.include(controller :'seomthing',action:'doSomething',id:'1')}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多