Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过定期调用remoteFunction从控制器获取数据?_Javascript_Grails - Fatal编程技术网

Javascript 如何通过定期调用remoteFunction从控制器获取数据?

Javascript 如何通过定期调用remoteFunction从控制器获取数据?,javascript,grails,Javascript,Grails,情况就是这样: 我有一个文件,每30秒更新一次信息。我创建了一个读取文件并提取所需数据的方法。在控制器中,比如说RefreshController,我有一个方法ref,每30秒调用一次: def ref = { def Helper h = new Helper() def d = JSON.parse(h.readFile()) render(view: 'index', model: [data: d]) } 通过grailsremoteFunction: <

情况就是这样:

我有一个文件,每30秒更新一次信息。我创建了一个读取文件并提取所需数据的方法。在控制器中,比如说
RefreshController
,我有一个方法
ref
,每30秒调用一次:

def ref = {
    def Helper h = new Helper()
    def d = JSON.parse(h.readFile())
    render(view: 'index', model: [data: d])
}
通过grails
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>

设置间隔(刷新次数,30000);
函数refreshMe(){
${remoteFunction(控制器:'refresh',操作:'ref',onSuccess:'justDoIt(e);')}
}
函数justDoIt(e){
alert('hello');//动态创建表,但缺少来自控制器的数据
}
问题是,如何从控制器获取或访问刷新后的数据到javascript函数中?我可以访问
${data}
,但在这种情况下,我只能获取控制器中
data
变量的第一个初始化值

我希望使用刷新的数据动态创建表,而不是在现有元素上创建表


如果有任何想法,我将不胜感激

在您的控制器上,只需呈现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>

页面标题
函数refreshMe(){
//警报(“刷新js”)
${remoteFunction(控制器:'refresh',操作:'ref',onSuccess:'justDoIt(数据,文本状态);')}
}
函数justDoIt(数据、文本状态){
警报(响应数据+“”+文本状态);
}
以下是我的解决方案:

控制器:

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


用电
setInterval(“refreshMe();”,30000);
函数refreshMe(){
${remoteFunction(操作:'ref',控制器:'refresh',onSuccess:'makeTable(e)}
}
函数makeTable(e){
var d=e.responseText.evalJSON(true);
//对数据d做些什么
}

回答这里-@tomas感谢您的指点,但这没有帮助。通过调用remoteFunction/remoteLink一次,我没有问题。我需要每30秒做一次,我想,对于这一点,remoteFunction应该在javascript代码中。然而,由于某些原因,我在'data'参数中没有得到任何东西。谢谢Alidad!事实上,你的想法最接近我找到的解决方案。我在下面提供。
<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>