期间更新与数据表中已经存在我有一个小的困境,并认为这可能是一个设计问题。根据一些条件(复选框等),我有一个返回到我的视图(searchResults)的联系人列表。基本上是一种高级搜索。Grails的 - AJAX调用
每个触头具有在字段三通设置,要么允许编辑,示出的细节,或“hitThis”。 hitThis方法执行一系列任务,将为联系人生成三个新值 - 年龄,大小和速度。当我点击该链接,我想基本上更新该行只与新值(列已经存在,只是为空)。
我在我的gsp中有一个div,其中包含一个显示searchResults列表的表。在我的表单提交搜索结果期间,我返回更新我的模板div存在的联系人列表。这工作正常。
在该div,我有一个形式,例如:
<td>
<g:form>
<fieldset class="buttons">
<g:hiddenField name="id" value="${contactInstance?.id}" />
<g:set var="searchResults" value="${searchResults}" /><br/>
<g:set var="cID" value="${contactInstance?.id}" /><br/>
<g:actionSubmit class="edit" action="edit" value="${message(code: 'Edit')}"/>
<g:actionSubmit class="show" action="show" value="${message(code: 'Show')}"/>
<g:remoteLink action="hitThis" value="Click Me" update="searchResultsDiv" params="[searchResults:searchResults, cID:cID]"/>
</fieldset>
</g:form>
</td>
当我选择远程链接hitThis,我想执行,将更新都附加在contactInstance行三列的动作在SearchResult所模板:
点击之前:
myName age size speed Tom empty empty empty
后点击:
myName age size speed Tom 20 6 4.9
我认为渲染会处理它,但是对hitThis的调用不会返回最初传递来更新该表的searchResults列表(可能相当大)。我宁愿不传递列表,因为我觉得这是过度的,性能会受到影响。
我可以将用户重定向到该联系人的信息页面(显示),但我宁愿更新表格。
我怎么能简单地更新一个div甚至表行,之后我hitThis呼叫,而无需通过一切回到控制器只需要再次通过呢?
编辑:
所以我的结果现在根据例子你给我的是类似这样(的名字是泰德,大小为5,速度为4:
name size speed
Ted54 Ted54 Ted54
这里我的部分观点:
<td id="name-${contactInstance.id}"><g:render template="name" model="['contactInstance':contactInstance]"/></td>
<td id="size-${contactInstance.id}"><g:render template="size" model="['contactInstance':contactInstance]"/></td>
<td id="speed-${contactInstance.id}"><g:render template="speed" model="['contactInstance':contactInstance]"/></td>
<fieldset class="buttons">
<g:hiddenField name="id" value="${contactInstance?.id}" />
<g:remoteLink action="moreInfo" params="['cid':contactInstance?.id]" onSuccess="updateData(data,'${contactInstance?.id}'), updateData2(data,'${contactInstance?.id}'), updateData3(data,'${contactInstance?.id}')" >TEST</g:remoteLink>
</fieldset>
这里是我的javascript:
<script>
function updateData(data, id) {
alert(data);
$('#name-'+id).html(data);
}
function updateData2(data, id) {
alert(data);
$('#size-'+id).html(data);
}
function updateData3(data, id) {
alert(data);
$('#speed-'+id).html(data);
}
</script>
而且我控制器的方法:
def moreInfo() {
def contactInstance = Contact.get(params.cid)
contactInstance.name= "Ted"
contactInstance.size= "5"
contactInstance.speed= "4"
if (contactInstance.save(flush: true)) {
println(contactInstance)
}
render(template:'name', model:[contactInstance:contactInstance])
render(template:'size', model:[contactInstance:contactInstance])
render(template:'speed', model:[contactInstance:contactInstance])
}
我在示例中添加了一些额外的代码。我是否需要为每个表列条目处理渲染?我可以在一个模板中处理所有3个吗? – user82302124 2012-03-05 14:31:48
您可以使用单个模板并使用模型来自定义响应。见http://grails.org/doc/latest/ref/Tags/render.html – aldrin 2012-03-05 15:40:35
好极了 - 我想我已经有了。我有一个contactRow的模板,hitThis试图渲染新的视图。如何使用JavaScript来刷新联系人的tds?我将所有联系人详细信息放在模板中,联系人的每个属性都以TD形式表示(我只想刷新那3个)。 – user82302124 2012-03-05 17:25:31