Grails 可以编写响应吗?
Posted
技术标签:
【中文标题】Grails 可以编写响应吗?【英文标题】:Can Grails compose responses? 【发布时间】:2014-02-13 05:58:21 【问题描述】:LinkedIn 的人们一直在以一种有趣的方式使用 Play 来处理需要由许多不同组件组成的页面:http://engineering.linkedin.com/play/composable-and-streamable-play-apps
他们如何做到这一点的关键部分是 Play 中的“动作”返回完整响应,因此能够通过更高级别的动作“组合”成另一个响应。
Grails 似乎并没有真正从动作中返回任何东西(或者至少没有任何具体的东西),而且当你在一个动作中时也没有一种简单的方法来调用另一个动作。
那么,这种风格的组合响应是否可以通过 Grails 实现?
【问题讨论】:
您可能会使用 Forward 来做类似的事情:grails.org/doc/latest/ref/Controllers/forward.html。不过,我没有在您提供的链接上观看视频。所以,把这个和一粒盐一起吃吧。 @gregg 你应该看视频:) 【参考方案1】:我看了视频,很棒的东西。
我想不出任何方法来撰写严格遵守 Grails 功能的响应(您说得很好,没有简单的方法可以从另一个操作调用一个操作),但是您可能会获得一些演示文稿中显示的将 Grails 控制器 模板呈现 与 Ajax 调用相结合的好处(是的,这显然只是一种解决方法)。
无论如何,我会设置一个 home.gsp 来定义主布局:
<html>
<head></head>
<body>
<div><h1>Title</h1></div>
<div id="section1"></div>
<div id="section2"></div>
</body>
然后添加一些Ajax:
$(document).ready(function()
$.ajax(
type: "POST",
url: "$g.createLink(controller: 'home', action: 'section1')",
dataType: "html",
success: function (data)
$('#section1').html(data);
);
$.ajax(
type: "POST",
url: "$g.createLink(controller: 'home', action: 'section2')",
dataType: "html",
success: function (data)
$('#section2').html(data);
);
);
HomeController 看起来像这样:
...
def section1()
// Some code to fetch cool data...
render template: 'section1', model: data
def section2()
// Some code to fetch cool data...
render template: 'section2', model: data
...
(我省略了模板 _section1.gsp 和 _section2.gsp。)
只要 ajax 调用返回数据,模板就会在页面中呈现。此外,section 是独立的,这意味着您可以编辑 section1 的内容和布局,而无需担心 section2。
只是为了尝试一下,我做了一个小(而且很丑,没有太多时间)grails 应用程序 (https://github.com/nicosalvato/tochi)。
这就是说,也许您的问题比实际问题更具理论性(“Grails 如何处理函数式编程”之类的问题)。如果我完全没有抓住重点,请随意称我为白痴:)
【讨论】:
我看到这种方法的唯一问题是它把合成的负担放在了浏览器上,这增加了请求的数量。 :( 否则,是的,它确实实现了类似的行为。(是的,我的问题部分是理论上的,因为我很确定 Grails 不能用于 Big Pipe 风格的应用程序。) @cdeszaq 你说的对,这种方法隐含的大量浏览器请求是完全正确的,我没有指出一个缺点。以上是关于Grails 可以编写响应吗?的主要内容,如果未能解决你的问题,请参考以下文章