1

タペストリーにカスタムテキストフィールドを作成しようとしています。これは、フォーカスが得られたときにJavaScriptをレンダリングします。しかし、私はこの例を見つけるのに苦労しています。

ここに私が始めたコードのいくつかがあります:

package asc.components;

import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Field;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.ComponentDefaultProvider;


public class DahserTextField implements Field {

@Parameter (defaultPrefix = "literal")
private String label;
@Inject
private ComponentResources resources;
@Inject
private ComponentDefaultProvider defaultProvider;
@Parameter
private boolean disabled;
@Parameter
private boolean required;

String defaultLabel(){
    return defaultProvider.defaultLabel(resources);
}

public String getControlName() {
    return null;
}

public String getLabel() {
    return label;
}

public boolean isDisabled() {
    return disabled;
}

public boolean isRequired() {
    return required;
}

public String getClientId() {
    return resources.getId();
}


}

私は次に何をすべきか確信が持てませんでした。.tml ファイルに何を入れればよいかわかりません。誰かが助けてくれたり、正しい方向に向けてくれたりしてくれたら幸いです。

4

2 に答える 2

4

独自のコンポーネントでの機能を複製する必要はありませんTextField。代わりに、コンポーネントミックスインを作成する必要があります。ミックスインは、既存のコンポーネントに動作を追加するように設計されています。

Tapestry 5のドキュメントから:

Tapestry 5には、根本的な機能であるコンポーネントミックスインが含まれています。コンポーネントミックスインはトリッキーな概念です。基本的に、真のコンポーネントをミックスインと呼ばれる特別な限定コンポーネントと混合することができます。コンポーネントとそのミックスインは、コンポーネントテンプレートでは単一のタグとして表されますが、すべての要素のすべての動作が示されます。

次のようにミックスインを使用します。

<input type="text" t:type="TextField" t:mixins="MyMixin" t:someParam="foo" />

ミックスインスタブ:

@IncludeJavaScriptLibrary("MyMixin.js")
public class MyMixin {

    /**
     * Some string param.
     */
    @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
    private String someParam;

    @Environmental
    private RenderSupport renderSupport;

    @InjectContainer
    private AbstractTextField field;

    @AfterRender
    void addScript() {
        this.renderSupport.addScript("new MyJavascriptClass('%s', '%s');", 
                this.field.getClientId(), this.someParam);
    }

}

@InjectContainer含まれているTextFieldをMixinに挿入するアノテーションに注意してください。この場合、TextFieldのclientIdが必要です。

また@IncludeJavaScriptLibrary("MyMixin.js")、必要なJavascriptファイルを含む注釈にも注意してください。

Javascriptは次のようになります。

MyJavascriptClass = Class.create({

    initialize: function(textField, someParam) 
    {
        this.textField = $(textField);
        this.someParam = someParam;

        this.textField.observe('focus', this.onFocus.bindAsEventListener(this));
    },

    onFocus: function(event)
    {
        //do something
    }
}

このアプローチとの主な違いは、これには独自のJSクラスを定義し、Tapestryの組み込み機能を使用してJSをロードおよび初期化することが含まれることです。ミックスインの使用も、独自のコンポーネントを作成する場合と比較して、比較的軽量でエレガントです。

于 2010-05-10T13:46:22.053 に答える
0

.tml

<t:textfield onfocus="somethingCool()" />

Java はおそらく TextField を拡張する必要がありますか? おそらく、新しいスタイルシートもインポートする必要があります。

-- ページは実際にはコンポーネントなので、他のページと同じようにコンポーネントを作成します。他のコンポーネントをそれらに埋め込むことができます。これがあなたにとって良い出発点になることを願っています。

于 2010-05-10T13:11:42.440 に答える