我需要在我的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():选择自己,但它抛出了另一个异常,表示
属性值引用未关闭...
即使他们是。
非常感谢任何帮助。
答案 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
代码的显示方式。确保它的语法正确。