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下载