Wicket AjaxLink javascript处理程序显示奇怪的行为

时间:2014-01-14 09:47:47

标签: wicket wicket-1.6

我有ListView,显示Panel的列表,一个在另一个之下。每个面板都有一个按钮(通过AjaxLink实现),该按钮关闭面板并将其从列表中删除。

这就是ListView的初始化以及如何创建面板:

panelsList = new ArrayList<MyPanel>();
pnlContainer = new WebMarkupContainer("pnlContainer");

ListView<MyPanel> pnlItems = new ListView<MyPanel>("pnlItems", panelsList) {
    @Override
    protected void populateItem(final ListItem<MyPanel> item) {
        item.add(item.getModelObject());
        item.add(new AjaxLink<Void>("pnlClose") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                panelsList.remove(item.getModelObject());
                target.add(pnlContainer); // repaint panel container
            }
        });
    }
};

pnlContainer.setOutputMarkupId(true);
pnlContainer.add(pnlItems);
add(pnlContainer);

这样做到目前为止 - 触发添加新面板(通常也是AjaxLink s)的操作可以完成它们的操作,并且可以正确添加和显示新面板。但是我无法让关闭按钮完全正常工作。

请参阅以下步骤:

1)我启动服务器并导航到主页面。 ListView最初填充了一个面板。

此面板的关闭按钮代码:

<a wicket:id="pnlClose" id="pnlClose7" href="javascript:;">Close</a>

搜索 pnlClose7 的页面代码,找到以下javascript代码,使按钮按预期工作:

Wicket.Ajax.ajax({"u":"./?0-1.IBehaviorListener.0-pnlContainer-pnlItems-0-pnlClose","e":"click","c":"pnlClose7"});;

注意:我现在不按下按钮,如果我愿意,它会按预期工作(经过全面测试)。

2)我触发了一个打开第二个面板的操作。该面板按预期显示在第一个面板下方。

第一个面板的关闭按钮:

<a wicket:id="pnlClose" id="pnlClosef" href="javascript:;">X</i></a>

第二个面板的关闭按钮:

<a wicket:id="pnlClose" id="pnlClose10" href="javascript:;">X</i></a>

但是现在,既没有搜索 pnlClosef 也没有 pnlClose10 找到一些javascript代码。按钮(两个!)都不起作用。我仍然可以找到 pnlClose7 的javascript代码。

3)我按F5重新加载页面。

按钮ID更改为 pnlClose1a pnlClose1b 。这两个ID都有javascript对应并且有效。

4)我按下第一个按钮(上面板,ID pnlClose1a )。该小组按预期关闭。

其余按钮的ID更改为 pnlClose1c ,同样没有javascript对应项。 pnlClose1a pnlClose1b 的Javascript代码仍然存在。

总而言之,我的AjaxLink的javascript处理程序似乎有羞怯问题,只有在我按F5或以任何其他方式重新加载整个页面后才出现。我想这是因为重新绘制pnlContainer会更改当前面板的ID - 但为什么链接的javascript不会同时更新?我可以在代码中更改任何内容以更新整个页面而不完全重新加载吗?

奇怪的是,我很确定之前有效...但我检查了整个班级的历史,并且找不到任何会引发这种情况的重大改变。 ListView - 代码主要是静态的,因为我添加了它。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。如果您的页面或面板中有任何硬编码的javascript代码html文件(使用&lt; script&gt;标记)将其删除并在面板的renderHead中设置该js代码。