2014-01-15 3 views
0

Я пытаюсь вернуть результат от метода действия контроллера к функции 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) 
} 

Он отображается только «объект Object "

второй:

метод в контроллере:

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

Вы вызываете remoteFunction асинхронно, что по умолчанию, но вы не предоставляете обратный вызов. Итак, что вам нужно сделать, это передать в метод с идентификатором некоторой области страницы, которую вы хотите изменить. Вот отличный учебник по использованию метода 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}" /> 
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. туРипсЫоп() запускает действие в контроллере. 2. div addChatResult обновляется 3. myFunction() считывает данные из addChatResult и ведет себя соответственно

Существует много проблем с этим подходом. Во-первых: myFunction() ожидает, что addChatResult будет обновлен (setTimeout), и нет никакого способа узнать, сделано ли это уже. Второе: использование div addChatResult позволяет мне только возвращать одиночные строки и списки объектов. Я хотел бы найти способ пропустить точку 2. и вернуть результат непосредственно к методу JavaScript без использования каких-либо временных разделителей. Просьба сообщить.

Смежные вопросы