java - Apache wicket 按钮 setMarkupId 不起作用

标签 java javascript html apache wicket

我有:

  • ListView
  • 按钮
  • 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;
            }
        }; 
    }
});

最佳答案

确保您调用的是 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/

相关文章:

java - hibernate :hbm2ddl.auto=生产中的更新?

javascript - 在移动 Chrome 中启动 HTML5 音频播放可以接受哪些事件

html - 即使在缩放后也能保持网页上的图像布局?

javascript - PUT方法 Mongoose 模型

javascript - 是否有最大 HTTP 状态代码消息长度?

html - 如何在 HTML 文件中使用 unix 变量

javascript - 用于 Html 渲染器的 JSPDF 库?

java - Android SimpleXML 解析的深度似乎有限

java - 使用 Xuggler 和 Red5 保存视频和其他音频之一的两个流

java - 在这种情况下用策略模式替换复杂的条件语句是否有意义