1

我有:

  • ListView
  • Button
  • WebMarkupContainer(弹出内容容器)

因此,当我填充 时,我向按钮ListView添加了一个。AjaxEventBehavior我也覆盖getAjaxCallDecorator(),因为我需要从每个按钮调用一个 javascript 函数。因此,在decorateScript函数中,我使用 覆盖WebMarkupContainer标记 ID setMarkupId(),它可以工作。我对 执行相同的操作Button,并且至少在我调用时有效getMarkupId()。但是当我转到生成的 HTML 时,它不存在!为什么会这样?

代码如下(它在populateItemfrom内部ListView):

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;
            }
        }; 
    }
});
4

1 回答 1

1

确保您正在调用infoBtn.setOutputMarkupId(true),以便 Wicket 知道它应该输出id属性。

通知setOutputMarkupPlaceholderTag(true)也在setOutputMarkupId(true)幕后呼唤。在不了解您的代码的情况下,您似乎并不真正需要它。setOutputMarkupPlaceholderTag()将输出一个空容器(<span id="xxx">如果组件不可见,只是为了引用组件所在的位置,并允许 Wicket 在 AJAX 响应中通过 DOM 进行操作(例如,使组件再次可见)。

作为旁注,如果您真的不需要id属性具有特定值,则可以通过不使用setMarkupId()并让 Wicketid为您生成 s 来简化代码。

此外,根据您的需要,通过或#prependJavascript()IAjaxCallDecorator删除并附加脚本可能更简单。onEventAjaxRequestTarget#appendJavascript()AjaxRequestTarget

于 2012-10-22T14:29:34.507 回答