我有:
ListView
按钮
WebMarkupContainer
(弹出内容容器)
因此,当我填充 ListView
时,我向按钮添加 AjaxEventBehavior
。我还重写了 getAjaxCallDecorator()
,因为我需要从每个按钮调用 javascript 函数。因此,在 decorateScript
函数中,我使用 setMarkupId()
覆盖 WebMarkupContainer
标记 id,它起作用了。我对 Button
执行了相同的操作,并且它有效,至少在我调用 getMarkupId()
时是这样。但是当我查看生成的 HTML 时,它不在那里!为什么会发生这种情况?
代码如下(位于 ListView
的 populateItem
内部):
infoBtn.add(new AjaxEventBehavior("onclick") {
@Override
protected void onEvent(AjaxRequestTarget target) {
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return new IAjaxCallDecorator() {
@Override
public CharSequence decorateScript(Component component, CharSequence script) {
StringBuilder jsScript = new StringBuilder();
infoPopoverContent.setMarkupId(infoPopoverContent.getMarkupId(true) + String.valueOf(pos));
infoBtn.setOutputMarkupPlaceholderTag(true);
infoBtn.setMarkupId(infoBtn.getMarkupId() + String.valueOf(pos));
jsScript.append("$('#" + infoBtn.getMarkupId() + "').popover({");
jsScript.append("html:true,");
jsScript.append("placement:'bottom',");
jsScript.append("content:function() {");
jsScript.append("return $('#");
jsScript.append(infoPopoverContent.getMarkupId());
jsScript.append("').html();");
jsScript.append("}");
jsScript.append("});");
logger.debug(jsScript.toString());
pos++;
return jsScript;
}
@Override
public CharSequence decorateOnSuccessScript(Component component,
CharSequence script) {
// TODO Auto-generated method stub
return null;
}
@Override
public CharSequence decorateOnFailureScript(Component component,
CharSequence script) {
// TODO Auto-generated method stub
return null;
}
};
}
});
最佳答案
确保您调用的是 infoBtn.setOutputMarkupId(true)
,以便 Wicket 知道它应该输出 id
属性。
通知 setOutputMarkupPlaceholderTag(true)
也在调用setOutputMarkupId(true)
在幕后。如果不太了解您的代码,看起来您并不真正需要它。 setOutputMarkupPlaceholderTag()
将输出一个空容器(<span id="xxx">
,以防组件不可见,只是为了引用组件所属的位置,并允许 Wicket 在 AJAX 响应中通过 DOM 进行操作(例如,使组件再次可见)。
作为旁注,如果您确实不需要 id
属性具有特定值,您可以通过不使用 setMarkupId()
来简化代码并让 Wicket 生成 id
适合你。
此外,删除 IAjaxCallDecorator
可能会更简单。并将脚本附加到 onEvent
中通过 AjaxRequestTarget#appendJavascript()
或 AjaxRequestTarget
#prependJavascript() ,取决于您的需求。
关于java - Apache wicket 按钮 setMarkupId 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959023/