Как получить данные из контроллера, периодически вызывая remoteFunction? - PullRequest
1 голос
/ 30 января 2012

Это ситуация:

У меня есть файл с информацией, обновляемой каждые 30 секунд.Я создал метод, который читает файл и извлекает необходимые данные.В контроллере, скажем, RefreshController, у меня есть метод ref, который вызывается каждые 30 секунд:

def ref = {
    def Helper h = new Helper()
    def d = JSON.parse(h.readFile())
    render(view: 'index', model: [data: d])
}

по граалям remoteFunction:

<g:javascript>
setInterval(refreshMe, 30000);
function refreshMe(){
    ${remoteFunction(controller: 'refresh', action: 'ref', onSuccess: 'justDoIt(e);')}
}
function justDoIt(e){
    alert('hello'); // to create the table on the fly, but missing the data from the controller
}</g:javascript>

Вопросесть, как получить или как получить доступ к обновленным данным из контроллера в функцию javascript?Я могу получить доступ к ${data}, но в этом случае я получаю только первое инициализированное значение переменной data в контроллере.

Я хотел бы использовать обновленные данные для создания таблицы на лету, а не для уже существующих элементов.

Буду признателен за любые идеи!

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Вот мое решение:

Контроллер:

import grails.converters.JSON
class RefreshController {
   def index = {}
   def ref= {
      def d = getString()
      render d as JSON
   }
   String getString(){
   // ...
   }
}

Вид:

<html>
<head>
<title>Power In Use</title>
<meta name="layout" content="main" />
<g:javascript library="prototype"/>
</head>
<body>
<g:javascript >
  setInterval( "refreshMe();", 30000 );
  function refreshMe(){
      ${remoteFunction(action:'ref', controller:'refresh', onSuccess: 'makeTable(e)')}
  }
  function makeTable(e){    
  var d = e.responseText.evalJSON(true);
  // do something with data d
  }
</g:javascript>
</body>
</html>
1 голос
/ 30 января 2012

На вашем контроллере просто визуализируйте свой результат json вместо представления, посмотрите на пример ниже, когда вы отображаете представление, ваш объект данных будет вашим представлением.Также onSuccess имеет параметр данных.Надеюсь, это поможет

class RefreshController {

def index() { }

def ref () {
    println params
    def json = new JsonBuilder()
    json.state
    {
        name "Colorado"
        statehood 1876
        capital "Denver"
        majorCities "Denver", "Colorado Springs", "Fort Collins"
    }

    render json
}

}

Просмотр:

    <!doctype html>
<%@ page import="com.package.example.*" %>
<html>
<head>
<title>Page Title</title>
 <meta name="layout" content="main"/>
<r:require modules="jquery"/>
<r:script>
   function refreshMe(){
    //alert("refresh js")
        ${remoteFunction(controller: 'refresh', action: 'ref', onSuccess: 'justDoIt(data,textStatus);')}
    }
    function justDoIt(data,textStatus){
        alert(responsData+" "+textStatus); 
    }
</r:script>

</head>

<body>
<a href="javascript:refreshMe();">Link text</a>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...