3

質問:
ZK でカスタム コンポーネントを使用する場合、コンポーネントのコンテンツ (任意に複雑) をビルドするライフサイクルの最適な時期はいつですか。つまり、ビューからすべてのデータを取得したと安全に想定できるのはいつですか。

詳細:
ZK では、カスタム コンポーネントを作成できますMyCoolComponent

package my.package;

public class MyCoolComponent extends Div {

  private String title;

  public MyCoolComponent() {
    Selectors.wireVariables(this, this, Div.class);
    Selectors.wireComponents(this, this, false);
    Selectors.wireEventListeners(this, this);
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  // When is the correct time to call this function?
  public void initializeComponent() {
    appendChild(new Label(title));
    // arbitrarily complex initialization follows ..
  }

}

次のように、zul ファイルでカスタム コンポーネントを使用できます。

<?component name="coolcomponent" class="my.package.MyCoolComponent" ?>
<zk>
  <coolcomponent id="cool" height="200px" title="Sean is Cool" />
</zk>

さて、これを使用するときは、たとえば で関数を呼び出して、 Componentchildren を追加したいと考えています。ComponentsinitializeComponentMyCoolComponent

の世界でComposersは、この種の作業はすべて関数After Composeを使用してライフサイクルのフェーズで処理するように教えられていdoAfterComposeます。Componentこのように作成されたものにも同じことが当てはまりますか?もしそうなら、そうするための最良の(読む:効率的で、安全で、読みやすい)方法は何ですか?@Listenイベント用の を付けるのonRenderが雑な気がします。何かご意見は?

4

2 に答える 2

1

zk docsを理解している限り、例のようにメソッド を呼び出すと、コンストラクターは のようdoAfterComposeになります。
Selectors

しかし、あなたがやりたいことは

public void setTitle(String title) {
  this.title = title;
    if(label != null)
      appendChild(new Label(title));
    else
      lebel.setValue(title);
}

zk のライフ サイクルは、zul コンポーネントに入ると<MyComponent>
コンストラクターを呼び出し、そのようなものがtitle="Sean is Cool"
あれば set メソッドを呼び出し、これがすべて行われるとComponentsページを作成します。
これは役に立ちますか?

編集

より複雑な構造の場合、2 つのオプションがあります。

  1. 必要な構造で zul ファイルを作成し、Executions#CreateComponentまたはを使用します。
  2. 独自のzk-Component-Widgetパッケージを作成する

あなたの目的に適したものは何ですか?

  • (再) 使用したい zk コンポーネントの構造がある場合は、1. を選択します。
    フォーラム投稿の構造はそのようなものかもしれません。

  • 2 を選択します。特別な機能を追加したい場合、
    クライアントとサーバー間の通信を最適化/カスタマイズ
    し、JavaScript ライブラリのバインディングを記述し、
    クライアント側でメモリ サイズを小さく保ちます (複雑な構造の場合でも、1 つのクラスだけが必要です)
    ... .
    独自のコンポーネントには確かに多くの利点がありますが、
    それらを実装するには時間がかかります。

では、ライフサイクルについてはどうでしょうか。オプション2については、ドキュメントを読んでください。
オプション 1 についてdoAfterComposeは、イベント リスナー/ハンドラー内またはイベント リスナー/ハンドラー内で実行します。

これはオプション 1 の例です。

主なズール

<zk>
  ...
  <div id="menu" use="myPkg.MyMenu" item1="omg" />
  ...
</zk>

私のメニュー定義

<vbox>
  <label id="item1" value="${arg.item1}">
  ...
</vbox>

ジャワ

class MyMenu extends Div {
  String item1;
  ...
  public void setItem1(String x){
    item1 = x;
  }

  // onCreate is fired before data is send to the client,
  // but after the Component and all it children exists.
  public void onCreate(CreateEvent ev){
    Executions.CreateComponents("MenuDef.zul", this, new HashMap<String, Object>(){{
        put("item1", item1);
    }});
  }
}

Executions.CreateComponentsメインのzul からを呼び出すこともできますdoAfterCompose
が、もちろん、
zul で値を設定する場合は、この方法のonCreate方が適しています。
Java でコンポーネントを内部に追加することも問題なくonCreate()動作
しますが、zul に書き留めた方が読みやすく、保守しやすくなります。


ここで、質問を一言Componentsで言うdoAfterComposeと、Create Event.

于 2013-01-16T16:31:50.653 に答える
0

ZK では、子ノードはその親の前に作成されます。子の onCreate イベントがトリガーされたときに値を設定するか、MyCoolDiv s コンストラクターで onCreate イベントをリッスンするイベント リスナーを追加し、そのリスナーで init を呼び出します。

詳細については、zk fiddle Div テストのサンプルを参照してください。

于 2013-01-16T16:13:23.880 に答える