[Wicket-ja-user 625] Re: AjaxFormSubmitBehavior#getPreconditionScript()が出力するjavascriptについて

Back to archive index

Tsutomu Yano t_yano****@me*****
2012年 3月 6日 (火) 20:12:41 JST


矢野です。

うまく再現しないですねえ…

サンプルをこっちで動かしてみましたが、alertでは Wicket.$$(this) は true を返しますね。
説明によると、最終的にはsetTimeoutに渡すようなので、setTimeout も使ってみたんですが、やっぱり Wicket.$$(this) は true を返しますねえ…

this を変えるために、var hoge = function() {... のところを var hoge = { myfunc: function() {... などと、this が別オブジェクトになるようにしたりもしてみましたが、やっぱり true になるんですよね。

コードはこんな感じです。

public class MyAjaxCallDecorator extends AjaxCallDecorator {
    private static final long serialVersionUID = 1L;

    @Override
    public CharSequence decorateOnSuccessScript(Component c, CharSequence script) {
        return "alert(Wicket.$$(this));";
    }

    @Override
    public CharSequence decorateScript(Component c, CharSequence script) {
       StringBuilder builder = new StringBuilder();

       builder.append("var hoge = function() {");
       builder.append(script);
       builder.append("};");
       builder.append("setTimeout(hoge, 10)");
       return builder.toString();
    }
}

実行可能なコードもgithubから取得できます。

https://github.com/tyano/wicket15-snippet

git が使えない場合でも、左上あたりにある「ZIP」ってボタンを押すと、zipファイルをダウンロードできます。

jp.javelindev.wicket.decorator

というパッケージ化にいろいろ入っています。
このコードでは再現しないんですよねえ。なにかが違うのだと思うのですが。。


---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

On 2012/03/05, at 23:46, maga****@hagan***** wrote:

> 船田です。
> 
> ありがとうございます。
> 
> 最初は同じように、セキュリティ的な意図かと思いましたが
> どうも、thisがDOMエレメント以外を指したりしているっぽいので…
> 
> 少し極端な例ですがサンプルを作りました。
> 
> public class MyAjaxCallDecorator implements IAjaxCallDecorator {
> 
>    @Override
>    public CharSequence decorateScript(Component component, CharSequence script) {
>        StringBuilder builder = new StringBuilder();
> 
>        builder.append("var hoge = function(){");
>        //builder.append("alert(Wicket.$$(this));");
>        builder.append(script);
>        builder.append("};");
>        builder.append(" hoge();");
>        return builder.toString();
>    }
>    ……
> 
> }
> 
> 出力するjavascriptを匿名関数で括った
> IAjaxCallDecoratorを実装しTextFieldに追加しています。
> 
> new TextField<String>("param", new Model<String>(inputText)) {
>    @Override
>    protected void onInitialize() {
>        super.onInitialize();
>        add(new AjaxFormSubmitBehavior("onchange") {
>            @Override
>            protected IAjaxCallDecorator getAjaxCallDecorator() {
>                return new MyAjaxCallDecorator();
>            }
>            ……
>        });
>    }
> }
> 
> 何がやりたいのかと言いますと、
> Ajax開始前にやりたい処理(ページのロックとか)を
> scriptの前に挟んでhogeをタイマーに渡したいのです。
> 
> そもそもIAjaxCallDecoratorの
> 使い方が間違っているのでしょうか?
> 




Wicket-ja-user メーリングリストの案内
Back to archive index