【问题标题】:Tapestry Grid inside Zone update error区域内的 Tapestry Grid 更新错误
【发布时间】:2017-04-27 14:17:41
【问题描述】:

我正在尝试完成一个简单的任务:从数据库中删除一条记录,更新网格,其中源属性指向用户列表,从数据库下载。我在 tml 中有一个 Grid 组件:

<div t:type="zone" t:id="deleteZone" id="deleteZone">
<table t:type="grid" source="allAdmins" row="currAdmin" empty="blabla" model="adminTableModel"
           add="delete,lock">
        <p:deleteCell>
          <t:actionlink t:id="delete" context="${currAdmin.}" zone="deleteZone">
              Delete admin
          </t:actionlink> <!--context=""-->
        </p:deleteCell>
    </table>
</div>

在页面类中,我有:

public List<AUser> getAllAdmins() {
    return webHelpService.getAllUsers(true);
}

@InjectComponent
private Zone deleteZone;
Object onActionFromDelete(int code) {
    Admins adminToChange = dao.getAdmin(code);
    if(code!=0) {
       dao.deleteAdmin(adminToChange);
    }
    return deleteZone.getBody();
}

但是当我按下删除按钮时,我收到以下 Tapestry 错误:

org.apache.tapestry5.runtime.ComponentEventException: Render queue error in SetupRender.
location: points to line <t:actionlink t:id="delete" context="${currAdmin.code}" zone="deleteZone">

org.apache.tapestry5.ioc.internal.OperationException
location: point to Grid.tml line <thead t:id="columns"/>

java.lang.NullPointerException
 org.apache.tapestry5.internal.beaneditor.BeanModelUtils.add(BeanModelUtils.java:74)
org.apache.tapestry5.internal.beaneditor.BeanModelUtils.modify(BeanModelUtils.java:42)
org.apache.tapestry5.corelib.components.Grid.getDataModel(Grid.java:523)
org.apache.tapestry5.corelib.components.GridColumns.setupRender(GridColumns.java:112)
org.apache.tapestry5.corelib.components.GridColumns.setupRender(GridColumns.java)
org.apache.tapestry5.internal.structure.ComponentPageElementImpl$SetupRenderPhase.invokeComponent(ComponentPageElementImpl.java:174)
org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:133)
org.apache.tapestry5.internal.structure.ComponentPageElementImpl$SetupRenderPhase.render(ComponentPageElementImpl.java:181)
org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72)
org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:124)
org.apache.tapestry5.internal.services.PageRenderQueueImpl$1.renderMarkup(PageRenderQueueImpl.java:142)
org.apache.tapestry5.internal.services.RenderCommandComponentEventResultProcessor.renderMarkup(RenderCommandComponentEventResultProcessor.java:78)
org.apache.tapestry5.internal.services.PageRenderQueueImpl$Bridge.renderMarkup(PageRenderQueueImpl.java:62)
org.apache.tapestry5.internal.services.PageRenderQueueImpl.renderPartial(PageRenderQueueImpl.java:159)
org.apache.tapestry5.internal.services.PartialMarkupRendererTerminator.renderMarkup(PartialMarkupRendererTerminator.java:45)
org.apache.tapestry5.services.TapestryModule$37.renderMarkup(TapestryModule.java:2141) 

虽然 Grid 行的部分更改效果很好(未包含该代码),但我无法使用 Grid 组件重新加载整个区域。 谁能指出我的方向,完成用户的动态删除操作? 任何帮助将不胜感激!

【问题讨论】:

    标签: java asynchronous tapestry


    【解决方案1】:

    修复模型初始化问题后,我得到了以下工作代码:

    <t:zone t:id="deleteZone" id="deleteZone">
            <table t:type="grid" source="adminsSource" rowsPerPage="5" row="currAdmin" inPlace="true" model="adminTableModel" empty="Admins not found" class="t-data-grid table table-bordered">
    ...
    <p:deleteCell>
                    <t:actionlink t:id="delete" context="currAdmin.code" zone="deleteZone"
                        ${message:delete}
                    </t:actionlink>
    </p:deleteCell>
    

    获取模型:

    public BeanModel getAdminTableModel() {
            BeanModel<Admin> model;
            model = beanModelSource.createDisplayModel(Admin.class, messages);
            ...
            return model;
    }
    

    获取来源:

    public GridDataSource getAdminsSource() {
            return new HibernateGridDataSource(session, Admin.class);
    }
    

    所以,按下删除,我得到了当前显示的网格数据源页面的更新。希望这会对某人有所帮助)

    【讨论】:

      【解决方案2】:

      我发现该代码存在几个问题:

      1. 格的add

        "...仅在自动创建默认模型时使用。" https://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/corelib/components/Grid.html

        但同时您通过model="adminTableModel" 为网格提供自定义模型。

      2. ActionLink 上下文中的语法错误:context="${currAdmin.}"。最后多了一个点(.)。

      3. Don't use ${...} syntax for parameter bindings.

      【讨论】:

      • 好吧,从那以后我开始在模型设置中添加新列。根据第三点,从 context="..." 中删除了 ${...},谢谢。此外,我的列表更改为 HibernateGridDataSource。但是当我在网格表周围添加区域时,我再次在以下位置获得 NullPointerException:org.apache.tapestry5.corelib.components.Grid$DefaultGridSortModel.getSortConstraints(Grid.java:364) org.apache.tapestry5.corelib.components.Grid .setupDataSource(Grid.java:483) org.apache.tapestry5.corelib.components.Grid.setupRender(Grid.java:447) org.apache.tapestry5.corelib.components.Grid.setupRender(Grid.java) ...
      • 再次阅读 API 后,我认为,必须以某种方式使用 inPlace="true" 才能使网格能够更新。
      • Grid 的 inPlace="true" 允许使用 AJAX 更新内联网格以进行内置分页和排序,在这种情况下,网格确实被区域包裹,您可以使用操作链接从您的操作链接中引用该区域zone="^"。您发布的错误看起来像您更改页面上先前在 HTTP 会话中具有排序状态的网格列时发生的错误,应用程序重新启动应该会修复它。
      • 问题在于 modell getter:我没有使用 getModel(){...} 返回新模型,而是有字段模型,它是在 @SetupRender 阶段创建的。因此,当我按下网格页面或更新区域时,模型为空,因此挂毯尝试应用 DefaultGridSortModel,给出异常
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多