技术开发 频道

精通 Grails: 用 JSON 和 Ajax 实现异步 Grails

  添加处理 JSON 的 JavaScript

  您将创建的 addAirport() 函数负责两项简单的任务:将 JSON 对象装载到内存中,然后为各种目的使用字段。在这里,您使用纬度和经度值创建一个 GMarker,并将它添加到地图中。

  要使 工作,必须在 head 部分包含 Prototype 库,如清单 11 所示:

  清单 11. 在 GSP 中包含 Prototype

<g:javascript library="prototype" />

  接着,将清单 12 中的 JavaScript 添加到 init() 函数后面:

  清单 12. 实现 addAirport 和 drawLine

<script type="text/javascript">
var airportMarkers
= []
var line
function addAirport(response, position) {      
  var airport
= eval('(' + response.responseText + ')')
  var label = airport.iata + " -- " + airport.name
  var marker
= new GMarker(new GLatLng(airport.lat, airport.lng), {title:label})
  marker.bindInfoWindowHtml(label)
  
if(airportMarkers[position] != null){
    map.removeOverlay(airportMarkers[position])
  }
  
if(airport.name != "Not found"){
    airportMarkers[position]
= marker
    map.addOverlay(marker)          
  }
  document.getElementById(
"airport_" + position).innerHTML = airport.name
  drawLine()
}
function drawLine(){
  
if(line != null){
    map.removeOverlay(line)
  }
  
  
if(airportMarkers.length == 2){
    line
= new GPolyline([airportMarkers[0].getLatLng(), airportMarkers[1].getLatLng()])
    map.addOverlay(line)
  }
}    
</script>

  清单 12 中的代码做的第一件事是声明两个新的变量:一个变量用于存放线条,另一个数组用于存放两个机场标记。对传入的 JSON 调用 eval() 之后,就可以直接调用 airport.iata、airport.name、airport.lat 和 airport.lng 等字段。(要温习 JSON 对象,请参见 清单 5)。

  有了 airport 对象的一个句柄之后,创建一个新的 GMarker。这就是我们在 Google Maps 上用于查看的 “红图钉”。title 属性告诉 API,当用户的鼠标悬停在该标记上时,显示什么内容作为工具提示。bindInfoWindowHtml() 方法告诉 API,当用户在该标记上单击鼠标时,显示什么内容。将这个标记作为叠加层添加到地图上之后,调用 drawLine() 函数。顾名思义,它在两个机场标记之间画一条线(如果它们都存在的话)。

  要了解关于 GMarker、GLatLng 和 GPolyline 等的 Google Maps API 对象的更多信息,请参阅在线文档(见 参考资料)。

  输入两个机场,应该会看到如图 5 所示的页面:

  图 5. 显示两个机场和它们之间的连线  

  更改 GSP 文件时,别忘了刷新 Web 浏览器。

  您已经获得从本地 Grails 应用程序返回的 JSON,在下一节,您将动态地从一个远程 Web 服务得到 JSON。当然,得到 JSON 之后,就可以像在这个例子中一样使用它:将它装载到内存中,然后直接访问不同的属性。

0
相关文章