ajax - 更新从另一个 Controller 呈现的 View 内的模板

标签 ajax grails render gsp grails-controller

我正在寻找在从另一个 Controller 而不是模板 Controller 呈现的 View 中刷新模板的方法,我的意思是:

我有两个 Controller AdminControllerUserController。还有两个 gsps /admin/listUsers & /user/_searchResult

然后一个想要渲染 View 的 listUsers 模板中有 _searchResult 就可以了。

现在,我想刷新模板_searchResult,但找不到如何刷新。我尝试调用 render(view:"/admin/listUsers", template:"/user/_searchResult", model:[searchResult:result])


AdminController.groovy

@Secured(['ROLE_ADMIN'])
def listUsers(){
    //...
}

UserController.groovy

@Secured(['ROLE_ADMIN'])
def search(){
    //search users for the givven params and send result by chain if there's an action or update a template if it's needed
    //in my case this method need to update the template _searchResult
}

@Secured(['ROLE_ADMIN'])
def searchResult(){
    //...
    [searchResult:result]
}

listUsers.gsp

//...
<formRemote name="searchForm" url="[action:"search", controller:"user"]">
     //Some fields for the search
     //I need to place here some hidden inputs to send which 
     //template i want to update or action to redirect
</formRemote>
<g:render template="/user/_searchResult"/>

//...

_searchResult.gsp

//Just itterate and print the search result in a table

希望我已经正确解释了问题,谢谢!

最佳答案

我不认为我完全理解你的问题,但我认为你困惑的根源是你命名事物的方式不遵循常规约定,而且你没有使用正确的工具来完成工作。让我解释一下...

Controller 上的方法称为 Action 。他们将一些数据(模型)发送到 View 以呈现为 HTML。 View 可以由称为模板的较小的、可重用的片段组成。 (抱歉,如果我在这里听起来像是居高临下,但我只是想确保我们都在同一页面上)。

现在,您所谓的 templateA 实际上是一个 View ,而不是模板。你是对的,templateA(你的 View )可以调用 templateB 来呈现一些标记,但是让 templateB 尝试调用另一个 Controller 上的方法是没有意义的。事情不是这样进行的。

如果在将模型发送到 View 后需要执行一些逻辑,则需要使用标签库 (http://grails.org/doc/latest/guide/theWebLayer.html#taglibs)。

总而言之,这里是一个快速回顾。

  1. 一个请求应该只调用一个 Action,它只将模型发送到一个 View 。
  2. 如果您需要在 Controller 之间重用逻辑,请将该代码移至服务。
  3. 如果您需要在 View 之间重复使用标记,请将该标记移至模板。
  4. 如果您有希望在将模型发送到 View 后执行的逻辑,请使用标签库。

希望这会为您指明正确的方向。

--- 更新 ---

好的,有了真实的代码,我可以更好地了解您要实现的目标。首先,当您使用 <g:formRemote>标签,你应该好好阅读 http://grails.org/doc/latest/ref/Tags/formRemote.html 上的文档了解它的作用。

您将在这里看到 2 个单独的请求。第一个是浏览器的常规页面加载,由 listUsers() 操作处理。页面加载完成后,用户将输入搜索词并点击提交按钮。这将触发第二个 ajax 请求,该请求将由 search() 操作处理。此操作可以使用 _searchResult.gsp 模板呈现 HTML 表格以显示搜索结果。当浏览器得到它时,它会将它插入到你告诉它使用 <g:formRemote> 的“更新”属性放置它的 DOM 中。标签。

这里重要的是,从服务器的角度来看,这是两个完全独立的独立请求。他们都首先调用一个 Action ,然后将一个模型(一个包含一些数据的 map )发送到一个 View ,该 View 使用 HTML 呈现/合并数据并将其发送回浏览器。

两者之间的区别在于,第一个是浏览器加载完整的页面,而对于第二个请求,浏览器仅加载一小块 HTML(搜索结果表)并更新页面内容而无需重新加载.

所以你的代码看起来更像这样......

AdminController.groovy

@Secured(['ROLE_ADMIN'])
def listUsers() {
    render(view:"/admin/listUsers")
}

listUsers.gsp

<g:formRemote name="searchForm" update="insertSearchResultsHere"
          url="[controller: 'user', action:'search']">
    <input name="searchTerm" type="text" />
</g:formRemote>
<div id="insertSearchResultsHere"></div>

UserController.groovy

@Secured(['ROLE_ADMIN'])
def search() {
    // use the search term to get a List<User>
    render(template: "/user/searchResult", model: [users: users])
}

_searchResult.gsp

<table>
    <g:each var="user" in="${users}">
        %{-- Iterate through your search results --}%
    </g:each>
</table>

关于ajax - 更新从另一个 Controller 呈现的 View 内的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180286/

相关文章:

java - 将标准 java 集成到 Stripes、Grails、JRuby 和 Rails 等 Web 框架中

mysql - 非主 Grails 的重复条目问题

reflection - BRDF 通常是如何实现的?

unit-testing - 单元测试在 Grails 中使用 JsonBuilder 呈现 Json

jquery - 使用 PHP+jQuery AJAX 检查 MySQL 数据库的变化并加载变化?

javascript - Ajax 和范围问题

javascript - ASP.NET MVC 内联编辑

grails - 如何将集合字符串转换为集合

javascript - 从单个类渲染菜单栏并在 Yii2 中动态突出显示菜单

javascript - 计算单选按钮、选择和复选框的值