Grails重新加载gsp的正确方法是什么

时间:2014-10-04 11:55:03

标签: grails

最后更新:似乎问题与geomap有关并且不想更新,现在使用jvectormap重写它,因为它更符合我的要求。

所以

有一个有两个盒子的应用程序,一个包含一堆控制器(分辨率,区域和东西)。它对第二个盒子进行远程调用,然后获取该数据并提取大量内容,设置数据然后发送到谷歌可视化。

但是,如果我在类中使用render它完美地工作,可以看到它拾取正确的变量,并且它们看起来就像从一开始就做的那样。

问题是,如果我让它在没有渲染的情况下运行,那么gsp页面不会重新加载,它显示的代码与最初加载的相同(实际上,生成的图片消失了)

有没有办法告诉gsp页面重装或类似?

下面是一个像魅力(如果控制器呈现输出)的遥控器提交

    <g:formRemote name="mapRepmote" on404="alert('not found!')" update="page-body"
              url="[controller: 'mapren', action:'show']">
    <g:if test="${listreg == 'true'}">
        Regulation: <g:select name="regsel" from="${reglist}" value="${regreq}" />
    </g:if>
    <g:else>
        Regulation: ${regreq}
    </g:else>

    Resolution: &nbsp;<g:select name="ressel" from="${reslist}" value="${resreq}" />

     Region: <g:select name="mapsel" from="${maplist}" value="${mapreq}" />

<div id="bupdate"><Button type="submit">Update</Button></div>
</g:formRemote>

编辑:到底是什么 所以一直在玩,并一遍又一遍地得到相同的结果。 所以mapren控制器的show动作似乎确实被调用了。我可以看到对db层和所有的调用。如果我添加三个render语句,我可以看到请求进入。

    def show(String regsel, String mapsel, String ressel) {
        String mapcode
        switch (mapsel) {
            case "World": 
                mapcode="world"
                break
            case "Europe": 
                mapcode=150
                break
            case "Asia": 
                mapcode=140
                break
            case "Africa": 
                mapcode=002
                break
            case "Central Ameirca": 
                mapcode=017
                break
            case "Pacific": 
                mapcode=035
                break
            default:
                mapcode="world"
        }

        def restem = ressel.split('x')
        String mwidth = restem[0]
        String mheight = restem[1]
        render "I was asked to show reg: ${params.regsel} <BR>map: ${params.mapsel}<BR>Resolution ${params.ressel}<BR>"
        render "will generate map for ${regsel} on code ${mapcode} resolutio"
        render "I will ${mwidth} and ${mheight}"
        def query = Regstat.where {
            (reg==regsel)
        }
        def regcolumns = [['string', 'Country'],['number', regsel + 'Status']]
        def results = query.list(sort:"lupdate")
        def regdata = []
        results.each {
            regdata << [it.country.countryname,it.status]
        }
        def RegColors = ['0xF0F0F0','0x66CCFF','0x0000FF','0xCC66FF','0x9900CC','0x7D7D7D']
        [reg_columns: regcolumns, reg_data: regdata,reg_colors: RegColors, regioncode: mapcode, wwidth: mwidth, wheight: mheight]
    }
}

但是如果我删除了渲染调用,我原以为show.gsp会被加载吗? 但没有这样的运气。 附上了show.gsp文件。注意,当索引针对它生成第一个geomap时会生成它。

<%@ page import="org.grails.plugins.google.visualization.util.DateUtil" %>
<html>
    <head>
        <script src="http://maps.google.com/maps?file=api&v=2&key=ABCDEFG" type="text/javascript"></script>
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    </head>
       <body>

       <script type="text/javascript">
          function selectHandler(e) {
              alert('A table row was selected');
          }
       </script>
       <gvisualization:geoMap elementId="page-body" showLegend="${false}" region="${regioncode}" width="${wwidth}" height="${wheight}" colors="${reg_colors}" columns="${reg_columns}" data="${reg_data}" />


    </body>
</html>

1 个答案:

答案 0 :(得分:0)

好的,部分答案,但向后退一步:)

所以移动它并最终创建了一个mapren的直接静态版本,它有一个控制器(staticmapren)和一个模板(_mapdisp)。这些似乎工作正常,每次请求进入时,页面现在正确地使用文本更新。

问题是geomap只是第一次显示。 与此斗争了很多,然后意识到可能(只是可能)javascript控制台可能有关于此的事情...... 是的,事实证明......

Uncaught RangeError: Maximum call stack size exceeded

红鲱鱼嗯,也许,似乎那个人想要重装或不重装。它发生在大约40秒后,所以仍然没有线索为什么地图只是第一次出现

我的问题是,我究竟能做些什么,我是否可能会破坏物体并每次都获得一个新物体。

控制器的简化版本是:

类StaticmaprenController {

def index() {
    render "I am an index"
}
def show(String regsel, String mapsel, String ressel) {
    String mapcode
    mapcode="world"


    def restem = ressel.split('x')
    String mwidth = restem[0]
    String mheight = restem[1]
    //render "I was asked to show reg: ${params.regsel} <BR>map: ${params.mapsel}<BR>Resolution ${params.ressel}<BR>"
    //render "will generate map for ${regsel} on code ${mapcode} resolutio"
    //render "I will ${mwidth} and ${mheight}"
    def regcolumns = [['string', 'Country'],['number', regsel + ' Status']]
    def RegColors = ['0xF0F0F0','0x66CCFF','0x0000FF','0xCC66FF','0x9900CC','0x7D7D7D']

    def regdata = [['UK','3'],['United States','2'],['Russia','4']]
    String content = g.render (template:"mapdisp", model:[reg_columns: regcolumns, reg_data: regdata,reg_colors: RegColors, regioncode: mapcode, wwidth: mwidth, wheight: mheight])
    render content
    [reg_columns: regcolumns, reg_data: regdata,reg_colors: RegColors, regioncode: mapcode, wwidth: mwidth, wheight: mheight]

}

}

和_mapdisp模板

      Going to elementId="page-body" <BR>
      Testing some stuff showLegend="${false}" <BR>
      Will do region="${regioncode}" <BR>
       Lets go width="${wwidth}" and height="${wheight}"<BR>
       And these are the Beutiful colours colors="${reg_colors}" <BR>
       Now columns columns="${reg_columns}"<BR>
       And the data="${reg_data}"<BR>


       <script type="text/javascript">
          function selectHandler(e) {
              alert('A table row was selected');
          }
       </script>
              <gvisualization:geoMap elementId="geomap2" showLegend="${false}" region="${regioncode}" width="${wwidth}" height="${wheight}" colors="${reg_colors}" columns="${reg_columns}" data="${reg_data}" />
    </body>
    <div id="geomap2"></div>
</html> 

要获得geomap和google可视化,您需要安装api,并使用raw(Google Visualization API. Graphs are not displaying in gsp pages)进行一些修复

我还在页面主体中加载了api。 (添加以下行)

<%@ page import="org.grails.plugins.google.visualization.util.DateUtil" %>
<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="genmap-desk"/>
        <script src="http://maps.google.com/maps?file=api&v=2&key=ABCDEFG" type="text/javascript"></script>
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>

关于最大调用堆栈我可以做些什么建议?