我正在尝试将控制器的操作方法的结果返回给JavaScript函数。
我尝试了两种解决方法:
第一
控制器中的方法:
def addUser(String name, String id1, String id2) {
return "myValue"
}
JavaScript函数:
function myFunction(userId1, userId2, username) {
var id1 = $(userId1).val();
var id2 = $(userId2).val();
var name = $(username).val();
// <g:remoteFunction action="addUser" params="{name:name,id1:id1,id2:id2}" />
var variable = ${remoteFunction(action:'addUser', params:[name:name,id1:id1,id2:id2])};
alert(variable)
}
它只显示“对象对象”
第二
控制器中的方法:
def addUser(String name, String id1, String id2) {
return [value:"myValue"]
}
JavaScript函数:
function myFunction(userId1, userId2, username) {
var id1 = $(userId1).val();
var id2 = $(userId2).val();
var name = $(username).val();
// <g:remoteFunction action="addUser" params="{name:name,id1:id1,id2:id2}" />
${remoteFunction(action:'addUser', params:[name:name,id1:id1,id2:id2])};
var variable = "${value}";
alert(variable)
}
不显示任何内容。
我还尝试将我的变量放入会话中,该会话仅在刷新页面后才起作用。 我没有想法了。我错过了什么?
答案 0 :(得分:0)
您正在异步调用 remoteFunction ,这是默认设置,但您不能提供任何回调。因此,您需要做的是传递更新方法,其中包含您想要更改的页面区域的ID。以下是使用remoteFunction方法的一个很好的教程:http://javadeveloper.asia/grails-ajax-tutorial-remotefunction-tag/。另外,这是关于该方法的grails文档:http://grails.org/doc/2.3.4/ref/Tags/remoteFunction.html。
这样的事情:
<div id="myarea"></div>
<g:remoteFunction action="addUser" params="[name:name,id1:id1,id2:id2]" update="myarea" />
然后,您可以从具有变量的控制器渲染模板:
def addUser(String name, String id1, String id2) {
render(template: 'myvar', model: [myvar: "value"])
}
在模板(_myvar.gsp)中:
<g:set name="myvar" value="${myvar}" />
答案 1 :(得分:0)
谢谢adavis。我设法从控制器将结果导入JavaScript。不幸的是,我的解决方案不适用于演示/原型页面以外的任何其他内容。
JavaScript函数:
function myFunction(userId1, userId2, username) {
var id1 = $(userId1).val();
var id2 = $(userId2).val();
var name = $(username).val();
var tabNr = getTabNumber();
<g:remoteFunction action="addChat" params="{tabNumber:tabNr,id1:id1,id2:id2}" update="addChatResult"/>
setTimeout(function(){
var x = document.getElementById("addChatResult");
if (x.innerHTML.trim() != ""){
if (x.innerHTML.trim() == "noRoomsAvailable"){
alert("Maximum number of private conversations is 10.");
}
else if (x.innerHTML.trim() == "success") {
my_function(name, id1, id2);
}
else {
alert("Failed to start a private chat")
}
x.innerHTML = "";
}
}, 500);
}
Div来存储结果:
<div id="addChatResult" style="display: none;"></div>
addChat.gsp:
<g:set var="tomorrow" value="${new Date() + 1}" />
${status}
控制器中的方法:
def addChat(int tabNumber, int id1, int id2) {
String result = ""
if (chatRooms.hasRoomsLeft()) {
chatRooms.populateRoom(tabNumber, id1, id2)
result = "success"
}
/* ... */
else {
result = "fail"
}
[status:result]
}
它的作用是: 1. myFunction()触发控制器中的动作。 2. div addChatResult得到更新 3. myFunction()从addChatResult读取数据,并相应地运行
这种方法存在许多问题。首先:myFunction()等待刷新addChatResult(setTimeout),并且无法知道它是否已经完成。第二:使用div addChatResult只允许我返回单个字符串而不返回任何对象列表。 我想找到一种方法来跳过第2点,并将结果直接返回给JavaScript方法而不使用任何临时div。 请指教。