当前位置: 首页 > 知识库问答 >
问题:

Wicket ajax调用不呈现我的新组件

韶宏邈
2023-03-14

希望你能帮我解决这个问题,因为它已经困扰我几天了。

我对页面的标记:[表]

我的自定义DataTable扩展Java代码(扩展以确保添加了所有outputMarkUp):@override protected void onInitialize(){super.onInitialize();this.addtopToolbar(新的NavigationToolbar(this));this.addtopToolbar(新的HeaderStoolbar<>(this,(ISortableDataProvider)this.getDataProvider()));this.addbottomToolbar(新的NoRecordsToolbar(this));

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(CssReferenceHeaderItem.forReference(WarehouseToolbarCssReference.get()));
}

@Override
protected Item<T> newRowItem(String id, int index, IModel<T> model) {
    Item<T> item = super.newRowItem(id, index, model);
    this.lastId = Integer.valueOf(id);
    item.setMarkupId(this.getId() + item.getId());
    return item;
}

第一列使用自定义面板来填充列中的单元格,但经过大量尝试和测试后,我实际上最终使用了来自Wicket本身的常规节点:

<wicket:panel xmlns:wicket="http://wicket.apache.org">
    <a wicket:id="junction"></a>
    <span wicket:id="content" class="tree-content">[content]</span>
cellspacing="0" wicket:id="reasonData">[Reason data]</table>-->
</wicket:panel>

最后,创建新行并填充必要数据(它本身就是一个新的DataTable)以及填充Ajax-target的代码:

    public void onClick(AjaxRequestTarget target) {
      Integer currentRowIndex = Integer.valueOf(this.findParent(Item.class).findParent(Item.class).getId());
      String rowId = this.findParent(Item.class).findParent(Item.class).getMarkupId();
      Item<IColumn<OldOrder, String>> newChild = null;

      this.dataTable.setVisible(true);

      newChild = new Item<>(String.valueOf(this.findParent(DataTable.class).getLastId() + 1), currentRowIndex * -1, null);
      newChild.setOutputMarkupId(true);

      target.prependJavaScript(String.format("var item=document.createElement(\"tr\"); item.id=\"%s\"; $(\"#%s\").after(item);", newChild.getId(), rowId));

      this.populateChildRow(newChild);    // This is where the new row gets filled with the new data

      Component rows = this.findParent(DataTable.class).getBody().get("rows");
      if (rows instanceof WebMarkupContainer) {
        ((WebMarkupContainer)rows).add(newChild);
      }
      target.add(this.findParent(DataTable.class).getBody());
    }
// This is where the new row gets filled with the new data
    private void populateChildRow(Item<IColumn<ParentClass>, String>> item) {
      RepeatingView cells = new RepeatingView("cells"){
        @Override   // Overridden to check if this gets executed... it doesn't
        protected void onAfterRender() {
          super.onAfterRender();
          String stop = "STOP";
        }
      };

      item.add(cells);

      Item<?> cellItem = new Item<>("arbitrary", 1, null);
      cells.add(cellItem);

      cells.setVisible(false);
      cells.setOutputMarkupId(true);
      cells.add(AttributeAppender.append("colspan", this.findParent(DataTable.class).getColumns().size()));

      this.dataTable.setOutputMarkupId(true);
      cellItem.add(this.dataTable);   // The DataTable with the child data
    }

除了我应该清除一些代码之外,子数据永远不会呈现。有人能解释一下吗?

共有1个答案

长孙阳州
2023-03-14

我建议始终使用JavaScript,即创建一个新的,然后用JS填充它。完全不要使用Wicket的

单击展开链接时,执行类似target.appendJavaScript(“yourownfunction('”+link.getmarkupid()+“‘,”+somedataasjson+“)”);的操作。因此yourownfunction()将使用链接id查找其最近的父级,然后使用JS可以在其后面追加新行。一旦创建了行,您就可以根据需要使用带有数据的JSON来填充它。

 类似资料:
  • 问题内容: 我是新来的世界,我有这样的话: 然后单击,您将被打印在控制台上。现在将行更改为: 现在点击该按钮,我希望它会被渲染。但事实并非如此。 我不确定为什么会这样。请注意,我在方法中有上面的代码。 问题答案: 您可能希望有一个状态组件,该状态组件在单击按钮之后在按钮旁边显示另一个组件。您需要做的就是跟踪按钮是否被单击:

  • 我正在构建一个PhotoViewer,当用户按左键或右键时,它可以更改照片。我正在使用React、Redux、React router和React router Redux。当用户按下左键或右键时,我会做两件事,使用并发送一个操作来更新当前查看的照片,。我订阅状态更改以进行调试。 上面的每一行都会触发一个新的状态更改。因为我更新了,所以发送操作会更新存储,而更新url会更新存储,因为react r

  • 我是新来的反应。作为一个学习练习,我正在构建一个国际象棋应用程序 我想根据父级中的状态更改子级的DOM。当前,在父级组件的状态变化时,子级组件没有变化。 PS:请忽略任何语法错误。这段代码是实际代码的精简。如果你想看完整的代码,请看这里

  • 新的反应和反应路由器,使我有许多网页的工作。我在我的它看起来是这样的 我的租赁组件看起来像这样。 我要做的是创建一个名为localhost:3000/rentals的页面,它只在新页面中显示“rentals”组件中的段落。但是当我点击房屋上的租赁链接时。在jsx中,它显示“主”组件中的所有组件,包括图片、页眉和页脚组件 我尝试在路线上使用精确路径,但什么也没发生。我怎样才能做到这一点?

  • 我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。 简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!