2014-01-14 35 views
0

我有一个ListView,它显示Panel s列表,一个在另一个之下。每个面板都有一个按钮(通过AjaxLink实现),用于关闭面板并将其从列表中移除。Wicket AjaxLink JavaScript处理程序显示奇怪的行为

这是ListView控件是如何initalized以及如何面板创建:

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更改为pnlClose1apnlClose1b。这两个ID都有javascript对应和工作。

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

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

为了长话短说,我的AjaxLink的javascript处理程序似乎有害羞问题,并且只在按F5或以任何其他方式重新加载整个页面后才会出现。我想这是因为重绘pnlContainer会改变当前面板的ID - 但为什么链接的javascript不会同时更新?有没有什么我可以改变我的代码来更新整个页面而无需重新加载?

奇怪的是,我很确定这工作之前...但我检查了整个班级的历史,并找不到任何重大变化,将触发这一点。 ListView-代码主要是静态的,因为我添加了它。

+0

尝试设置为true:http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/markup/html/list/ListView.html#setReuseItems%28boolean%29 –

+0

哎呀,忘了补充说...已经尝试过,没有效果。在附加的说明中,页面设置为'isVersioned(){return false;}',如果这有什么区别的话。但我尝试了版本控制,但它也不起作用。与版本控制和重复使用项目相同。 – sina

回答

0

我有过类似的问题。如果您在页面或面板html文件中使用了任何硬编码的JavaScript代码(使用<脚本>标记),请将其删除并在面板的renderHead中设置该js代码。

+0

快速和肮脏的测试 - 我刚刚删除了包含硬编码javascript的所有组件(上面提到的任何面板都没有受到影响)。没有效果:( – sina

+0

我发现了这个解决方案,一个完全无关的(看起来很无辜的)组件在创建时向客户端推送一个空的javascript。不知道开发人员是否推出了这个推送,但是打破了整个页面。接受你的答案,因为它是指向正确方向的人。Wicket似乎对javascript ^^敏感 – sina