Grails - 如何将变量从控制器的动作返回到JavaScript?

时间:2014-01-15 21:02:04

标签: javascript grails

我正在尝试将控制器的操作方法的结果返回给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)
}

不显示任何内容。

我还尝试将我的变量放入会话中,该会话仅在刷新页面后才起作用。 我没有想法了。我错过了什么?

2 个答案:

答案 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。 请指教。