【问题标题】:Apache wicket Button setMarkupId not workingApache wicket Button setMarkupId 不起作用
【发布时间】:2012-10-18 16:10:57
【问题描述】:

我有:

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

所以,当我填充ListView 时,我会在按钮上添加一个AjaxEventBehavior。我还覆盖了getAjaxCallDecorator(),因为我需要从每个按钮调用一个javascript 函数。因此,在decorateScript 函数中,我使用setMarkupId() 覆盖WebMarkupContainer 标记ID,它可以工作。我对Button 做同样的事情,至少当我打电话给getMarkupId() 时它可以工作。但是当我转到生成的 HTML 时,它不存在!为什么会这样?

代码如下(在ListViewpopulateItem内):

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

【问题讨论】:

  • 您想要做的事情,在 Wicket 中可以更轻松地完成!
  • 谈论您的问题:请张贴用于填充项目的 HTML 标记。此外,如果可能,请发布生成的 HTML。

标签: java javascript html apache wicket


【解决方案1】:

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

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

附带说明,如果您真的不需要 id 属性具有特定值,则可以通过不使用 setMarkupId() 并让 Wicket 为您生成 ids 来简化您的代码。

此外,删除IAjaxCallDecorator 并通过AjaxRequestTarget#appendJavascript()AjaxRequestTarget#prependJavascript() 将脚本附加到onEvent 可能更简单,具体取决于您的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多