1

私は持っている:

  • ListView
  • Button
  • WebMarkupContainer(ポップアップコンテンツコンテナ)

そのため、 にデータを入力するときに、 ボタンListViewに を追加AjaxEventBehaviorします。getAjaxCallDecorator()各ボタンから JavaScript 関数を呼び出す必要があるため、もオーバーライドします。したがって、関数では、を使用してマークアップ IDdecorateScriptをオーバーライドします。これは機能します。に対しても同じことを行いますが、少なくとも を呼び出すと機能します。しかし、生成された HTML に移動すると、そこにはありません! なぜこうなった?WebMarkupContainersetMarkupId()ButtongetMarkupId()

コードは次のとおりです ( 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()せずに Wicket に を生成させることで、コードを簡素化できidます。

また、必要に応じて、または#prependJavascript ()IAjaxCallDecoratorを使用して、スクリプトを削除して追加する方が簡単な場合があります。onEventAjaxRequestTarget#appendJavascript()AjaxRequestTarget

于 2012-10-22T14:29:34.507 に答える