Tapestry 5.3.8提交包含区域的表格

时间:2017-03-02 14:25:27

标签: java ajax forms tapestry

在我的tml中,我有表格,其中字段由区域

更新

简化tml:

<form t:id="editUserForm" t:zone="editRefresh" t:type="form"> 

                    <label>Search For User to Edit: </label>
                    <input type="text" id="editUser"  /> 

        <t:any 
                t:id="addNew"
                element="button"  
                t:mixins="observe" 
                event="click" 
                zone="editRefresh"
                fields ="['editUser']" > 
                Edit Selected User
        </t:any>        

                <t:zone t:id="editRefresh"> 

                ...Fields here updated

                <input t:type="submit" t:id="editUserButton" value="Edit User" />

            </t:zone>
         </form>

这些字段的填充没有问题,但是在提交表格时我会受到欢迎:

Render queue error in SetupRender[app/Administration:editloginname]: Component app/Administration:editloginname must be enclosed by a Form component.

检查日志后,后端代码仍然执行,然后抛出此错误。

此外 - 有没有办法让提交页面刷新?我在表单标签中指定了一个t:区域,因此当按下t:any按钮时表单不会刷新,并且区域更新但是当提交表单时我希望它按照惯例工作。

作为一种解决方法,我注入了表单,表单已打开并更改

return editRefresh.getBody();

return adminPage;

这可以作为一种解决方法,但不是我认为理想的。

2 个答案:

答案 0 :(得分:3)

如果不包含表单,则无法呈现表单字段。这是因为Tapestry在呈现其字段时将某些内部状态存储在表单的隐藏输入中,如果您将该字段与表单分开呈现,则最终会出现无效的表单状态。

有关可用选项,请参阅此答案:https://stackoverflow.com/a/27961175/2414933

至于在提交时刷新页面:您可以继续使用您的解决方法,因为它完全有效。如果您不想将组件与包含页面结合使用,则可以在页面级别处理表单提交事件并 var options = { chart: { title: 'xxxx', subtitle: 'xxxx', focusTarget:'category' }, annotations: { textStyle: { color: 'black', fontSize: 11, }, alwaysOutside: true }, height:300, vAxis: {format: 'short'}, colors: ['#17807E', '#4285F4'] }; function drawAudits(Data) //data comes from another function with ajax call { var dataTbl = new google.visualization.DataTable(); dataTbl.addColumn('string', 'Months'); dataTbl.addColumn('number', 'Scheduled'); dataTbl.addColumn('number', 'Done'); dataTbl.addColumn({ type:'number' , role: 'annotation' }); dataTbl.addColumn({ type:'number' , role: 'annotation' }); for (var i = 0; i < Data.length; i++) { dataTbl.addRow([Data[i].month, Data[i].AllAudits, Data[i].DoneAudits, Data[i].AllAudits, Data[i].DoneAudits]); } //last 2 column for annotations var chart = new google.charts.Bar(document.getElementById('columnChartDiv')); chart.draw(dataTbl,options); } (请记住Tapestry events are bubbled)。

或者从表单组件中删除return this;属性。如果没有t:zone表单提交,则不会使用AJAX。

答案 1 :(得分:3)

我不知道我是否正确理解了您的问题,但如果您想将某个表单元素放入区域,您可以这样做:

http://jumpstart.doublenegative.com.au/jumpstart/examples/ajax/select1

这个例子帮助了我,我希望它也能帮到你。