0

AjaxLazyLoadPanel を含むページがあります。このページには、長い読み込みリストと AjaxButton の送信が含まれています。

AjaxLazyLoadPanel の準備が整った後、送信すると、別の長い読み込みが実行され、その後、ページ全体を更新する必要があります。これは私が自分自身を取得する場所です。コードは次のようになります。

    AjaxButton button1 = new AjaxButton("submit1") {
        @Override
        protected void onSubmit(AjaxRequestTarget target, Form form) {
            someLongWorkingMethod();
            setResponsePage(page); //refreshing page
        }
    };
    add(button1);

そして、それは完璧に機能します。しかし、私が今やろうとしているのは、メソッドが計算されているときにこのボタンを無効にするか、このボタン (または必要に応じてパネル全体) を非表示にすることです。 .

私はそれについて多くの投稿/メーリングリストを読みましたが、何も役に立ちませんでした。見つけたすべてのものを試し、someLongWorkingMethod()の前に配置しました:

ajaxLazyLoadPanel.setOutputMarkupId(true);
ajaxLazyLoadPanel.setOutputMarkupPlaceholderTag(true);
ajaxLazyLoadPanel.add(new AttributeAppender("style","display:none;"));
ajaxLazyLoadPanel.setVisible(false);
ajaxLazyLoadPanel.setEnabled(false);
target.add(ajaxLazyLoadPanel);

また、ajaxLazyLoadPanel ではなく、"this" (AjaxButton) についても同じです。

私は何かひどく間違ったことをしていますか、それとも何ですか? これは私がやろうとしていることでもありますか?助けていただければ幸いです。

4

2 に答える 2

1

@Robert Niestroj の回答 (ただし、最新の Wicket 6 でのみ動作) のおかげで、Wicket 1.5 の解決策が見つかりました。

まったく同様のアイデアですが、AjaxButton の getAjaxCallDecorator をオーバーライドし、純粋な Javascript を使用することで実現されます。

AjaxButton button1 = new AjaxButton("submit1") {
    String id = this.getMarkupId();
    @Override
    protected void onSubmit(AjaxRequestTarget target, Form form) {
        ...
    }

    @Override
    protected org.apache.wicket.ajax.IAjaxCallDecorator getAjaxCallDecorator() {
        return new AjaxCallDecorator() {
            @Override
            public CharSequence decorateScript(Component component, CharSequence script) {
                return "document.getElementById(\'"+id+"\').style.display = 'none';"+script;
            }
        };
    }
};

覚えておくべき重要なことは、スクリプト + [追加したスクリプト] を返すことを確認することです。そうしないと、onsubmit アクションが発生しません。

Wicket 1.5 docの詳細 (および onSucces と onFailure のバージョン)

于 2013-07-26T07:58:13.607 に答える
1

ボタンをクリックした直後に、jQuery を介してボタンを非表示にする をAjaxButtonオーバーライドupdateAjaxAttributes()して追加することができます。IAjaxCallListenerresponsePage がレンダリングされると、ボタンが再び表示されます。オーバーライドのコードは次のようになります。

@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
    super.updateAjaxAttributes(attributes); 
    attributes.getAjaxCallListeners().add(new IAjaxCallListener() {

        @Override
        public CharSequence getBeforeHandler(Component cmpnt) {
            return "$(\"#" + cmpnt.getMarkupId() + "\").hide()";
        }

        @Override
        public CharSequence getPrecondition(Component cmpnt) {
            return "";
        }

        @Override
        public CharSequence getBeforeSendHandler(Component cmpnt) {
            return "";
        }

        @Override
        public CharSequence getAfterHandler(Component cmpnt) {
            return "";
        }

        @Override
        public CharSequence getSuccessHandler(Component cmpnt) {
            return "";
        }

        @Override
        public CharSequence getFailureHandler(Component cmpnt) {
            return "";
        }

        @Override
        public CharSequence getCompleteHandler(Component cmpnt) {
            return "";
        }
    });
}
于 2013-07-25T23:00:54.493 に答える