1

dbから検索結果を出すフォームがあります。dbからの結果をx秒ごとに自動的に表示するにはどうすればよいですか?これは、x秒ごとに送信ボタンを意味します。リフレッシュについて私が見つけたのはこのクラスだけです:

add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(10)) {
    private static final long serialVersionUID = 1;       
    });

フォームを送信せずにページを更新するだけです。次に、改札の例のページからインスピレーションを得たいと思います:http ://www.wicket-library.com/wicket-examples/ajax/clock? 1しかし、ソースコードをクリックすると、次のURLが表示されます。内部エラー

アップデート:

単純なJavaScriptを呼び出して、jsからフォームを送信しようとしています。

    add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(10)) {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onPostProcessTarget(AjaxRequestTarget target) {
            target.appendJavaScript("alert('hello');");
        }

    });

しかし成功しなかった

4

3 に答える 3

2

AjaxFormSubmittingBehaviourをトリガーするイベントを発生させるには、 AbstractAjaxTimerBehaviourの組み合わせが必要です。私はこれを試しませんでしたが、改札の経験と両方の動作の JavaDocs から、うまくいくはずです。

いくつかのデモコードが必要なようですので...

免責事項:これは、言及された両方のクラスからのコピーアンドペーストによって数分でまとめられました。したがって、これは良いコード、テスト済みのコード、またはしっかりと確認せずに本番環境に投入したものではありません。しかし、うまくいくようです。

まず、結合された動作が必要です。

public abstract class AjaxTimerFormSubmitBehavior extends AbstractAjaxTimerBehavior {

    /**
     * should never be accessed directly (thus the __ cause its overkill to
     * create a super class), instead always use #getForm()
     */
    private Form<?> __form;

    private boolean defaultProcessing = true;

    /**
     * @param updateInterval
     */
    public AjaxTimerFormSubmitBehavior(Duration updateInterval) {
        this(null, updateInterval);
    }

    public AjaxTimerFormSubmitBehavior(Form<?> form, Duration updateInterval) {
        super(updateInterval);
        __form = form;

        if (form != null) {
            form.setOutputMarkupId(true);
        }
    }

    @Override
    protected void onTimer(final AjaxRequestTarget target) {
        getForm().getRootForm().onFormSubmitted(new IFormSubmitter() {
            public Form<?> getForm() {
                return AjaxTimerFormSubmitBehavior.this.getForm();
            }

            public boolean getDefaultFormProcessing() {
                return AjaxTimerFormSubmitBehavior.this.getDefaultProcessing();
            }

            public void onSubmit() {
                AjaxTimerFormSubmitBehavior.this.onSubmit(target);
            }

            public void onError() {
                AjaxTimerFormSubmitBehavior.this.onError(target);
            }
        });
    }

    /**
     * @return Form that will be submitted by this behavior
     */
    public final Form<?> getForm() {
        if (__form == null) {
            __form = findForm();

            if (__form == null) {
                throw new IllegalStateException(
                        "form was not specified in the constructor and cannot "
                                + "be found in the hierarchy of the component this behavior "
                                + "is attached to: Component="
                                + getComponent().toString(false));
            }
        }
        return __form;
    }

    /**
     * @see Button#getDefaultFormProcessing()
     *
     * @return {@code true} for default processing
     */
    public boolean getDefaultProcessing() {
        return defaultProcessing;
    }

    /**
     * Finds form that will be submitted
     *
     * @return form to submit or {@code null} if none found
     */
    protected Form<?> findForm() {
        // try to find form in the hierarchy of owning component
        Component component = getComponent();
        if (component instanceof Form<?>) {
            return (Form<?>) component;
        } else {
            return component.findParent(Form.class);
        }
    }

    /**
     * Listener method that is invoked after the form has been submitted and
     * processed without errors
     *
     * @param target
     */
    protected abstract void onSubmit(AjaxRequestTarget target);

    /**
     * Listener method invoked when the form has been processed and errors
     * occurred
     *
     * @param target
     */
    protected abstract void onError(AjaxRequestTarget target);

}

そして、あなたはそれを使わなければなりません

public class HomePage extends WebPage {
    private static final long serialVersionUID = 1L;

    private Integer counter = 0;

    public HomePage(final PageParameters parameters) {
        final Label label = new Label("counter", new PropertyModel<Integer>(this, "counter"));
        label.setOutputMarkupId(true);
        add(label);
        Form form = new Form("form");
        form.add(new AjaxTimerFormSubmitBehavior(form, Duration.seconds(10)) {

            @Override
            protected void onSubmit(AjaxRequestTarget target) {
                counter++;
                target.add(label);
            }

            @Override
            protected void onError(AjaxRequestTarget target) {
                // TODO Auto-generated method stub

            }
        });
        add(form);
    }

    public Integer getCounter() {
        return counter;
    }

    public void setCounter(Integer counter) {
        this.counter = counter;
    }
}

それがあなたにアイデアを与えることを願っています...

ここに小さなデモ war-file があります。ダウンロードして、お気に入りのアプリケーション コンテナに放り込んで、その動作を観察するだけです。ソースも含まれています。

于 2012-06-26T13:46:29.107 に答える
1

コードを定期的に実行する間隔を設定するには、JQuery を使用してこれを行うことができます。

$(document).ready(function(){
    //ajax code here
    myVar = setInterval(someCode, 10000);
});

それはあなたが何をしたいですか?

編集

気づいた... set Interval は実際には JQuery 関数ではありません。

//use this to stop it    
clearInterval(myVar);
于 2012-06-26T11:35:37.830 に答える
0

I think you did the right things, I think you attached the behavior to a component that doesn't change itself. You will need to write the update logic in the onPostProcessTarget method and add the component you want to refresh to the ajaxRequestTarget. Have a look at the network tab of Firebug or Chrome to see if the behavior triggers a call to the server.

If it's not the case, it might be that the precondition of the script fails (markup id change could do this)

于 2012-06-26T15:11:25.040 に答える