从gsp调用控制器功能

时间:2016-02-11 15:51:46

标签: javascript jquery grails groovy

我需要在我的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中使用remoteFunction():选择自己,但它抛出了另一个异常,表示

  

属性值引用未关闭...

即使他们是。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

要将RemoteFunction与Grails 3一起使用,您需要添加ajax-tags插件:org.grails.plugins:ajax-tags:1.0.0

答案 1 :(得分:1)

实际上,如果脚本在gsp中,你可以让你的gsp识别你的js中的一些Grails函数,并且在服务器端创建js所需的任何东西。在你的情况下,似乎你想做一个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内部;如果没有,你怎么能把数据传递给他们。

答案 2 :(得分:0)

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

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

此外,如果您使用谷歌Chrome浏览器的开发人员工具,您将看到javascript代码的显示方式。确保它的语法正确。