[Wicket-ja-user 228] Re: FormでComponentResolverを使用したい

Back to archive index

TAKEUCHI Hideyuki webma****@chime*****
2008年 9月 29日 (月) 16:35:42 JST


たけうちです。

autoAddでコンポーネントを追加すると、内部的にAUTOというフラグが
立つのですが、これが立っているとフォームデータの解析フェーズが
飛ばされてしまい、結果としてModelにデータが入力されません。

FormComponentの場合は、autoAddではなく下のようなメソッドを
自作し利用する必要があります。問題なく動きますが、
OpenではないAPIを使用するためその辺理解した上で利用してください。

1.4のソースになってしまいますが、全文を添付しておきます。

public boolean addForRender(Component component,
    MarkupContainer container, MarkupStream markupStream) {
  container.internalAdd(component);
  component.prepareForRender();
  try {
    if (markupStream == null) {
      component.render();
    } else {
      component.render(markupStream);
    }
  } finally {
    component.afterRender();
  }
  return true;
}

ではでは。

--
たけうち

Susumu ISHIGAMI さんは書きました:
> 石上です。
> お世話になっています。
> 
> 今開発中のもので、IComponentResolverを積極的に使用しようと考えています。
> 
> 思惑としては、データベースの定義から適切な入力フォームを自動で生成するよ 
> うな仕組みを作りたくて、
> その前段階として、次のようなクラスを作りました。
> 
> ============================================
> 
> public class AutoForm extends Form implements IComponentResolver {
>  〜 コンストラクタ省略〜
> public boolean resolve(MarkupContainer container, MarkupStream 
> markupStream, ComponentTag tag) {
> Component result = resolveComponent(container, markupStream, tag);
> if (result == null) {
> return false;
> }
> return container.autoAdd(result, markupStream);
> }
> 
> // 実際に使うときはこのメソッドをChainOfResponsivilityパターンのようにする。
> private static Component resolveComponent(MarkupContainer container, 
> MarkupStream markupStream, ComponentTag tag) {
> if (tag.isAutoComponentTag()) {
> return null;
> }
> String tagName = tag.getName().toLowerCase();
> if (tagName.equals("input")) {
> String type = tag.getAttributes().getString("type").toLowerCase();
> if (type.equals("text")) {
> return new TextField(tag.getId());
> }
> } else if (Arrays.asList(new String[] {"p", "div", "td", "th", "li", 
> "dd"}).contains(tagName)) {
> return new MultiLineLabel(tag.getId());
> }
> // その他はデフォルトでラベル
> return new Label(tag.getId());
> }
> }
> 
> ============================================
> 
> HTML側の定義が<input type="text">の場合は、TextFieldを作成という感じです。
> モデルに関しては、Formクラス初期化時にCompoundPropertyModelのように振る 
> 舞う自作のクラス※をセットしています。
> ※社内のフレームワークが独自のデータ構造を取るため仕方なく作成しました。
> 
> ところが、これが、思ったように動かきません。
> ・ページクラスのコンストラクタで、モデルオブジェクトに値をセットすると、 
> テキストフィールドにその値が表示されます。
> ・ページでテキストボックスに入力をしてsubmitをしても、値がモデルに反映さ 
> れません
> ・遷移先のページでは入力した値がかき消されて元の値が表示されてしまいます。
> ・resolverを使用しないで、手動でadd(new TextField("HOGEHOGE")をした場合 
> は、ちゃんと、データモデルの値に反映されます。
> ・return new TextField(tag.getId());の行にブレークポイントを置いてデバッ 
> グするとちゃんと到達しているようです。
>  (初期表示時・submit時共に)
> 
> ちなみにWicket1.3.4です。
> JDKは1.4.2です。
> 
> 私の力ではどうにも意味がわかりません。
> どうかお力をください。
> よろしくお願いします。
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
-------------- next part --------------
文字コード指定の無い添付文書を保管しました...
名前: SelfResolveForm.java
Download 


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