[Seasar-user:15486] Re: [Teeda]Treeコンポーネントの状態維持

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 8月 24日 (日) 03:00:03 JST


小林 (koichik) です.

Date:    Sat, 23 Aug 2008 18:10:48 +0900
From:    "Tetsuya Anzawa" <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:15484] [Teeda]Treeコンポーネントの状態維持

> Treeコンポーネントの状態維持で困っております。
> ツリーを操作(フォルダを開いたり、閉じたり)したタイミングでサブミットすることってできないでしょうか?

ツリーを操作する度サブミットするのは JavaScript を
使うツリーを使う必要がなくなってしまうような.

> 具体的に困っているのは、
> Teedaレイアウト機能を用いた「サイドメニュー(Treeコンポーネント使用)」+「メイン画面」で構成される
> WEBアプリにて、サイドメニューのツリーを操作(フォルダを開いたり、閉じたり)した後に、メイン画面を
> 操作すると、サイドメニューのツリーの状態が維持されないというものです。
> ツリーを操作した時点で状態が維持されるような方法があればと・・。

tree を含むメニューとメイン画面が異なった
<form> だと,メイン画面をサブミットした際に
tree の状態を維持するのは絶望的な感じです.

tree を使うのであれば,レイアウトでメニューを
<te:include> するのではなく,メイン画面の
<form> の内側でメニューを <te:include> する
くらいしか自分は思いつきませんでした.

・メイン画面の HTML

<form id="form">
  <te:include id="menu" te:src="/layout/menu.html"/>
  ...

・menu.html

  <input type="hidden" id="treeTreeSave" />
  <te:tree value="#{layout_menuPage.tree}" id="client-tree" var="node" varNodeToggler="t">
  ...

・MenuPage

public class MenuPage {
  public TreeNode tree;

  public void initialize() {
    if (tree != null) {
      return null;
    }
    tree = new TreeNodeImpl(...);
    ...
  }
}

メイン画面に対応するページクラスと異なり,
ポストバックでも initialize() が呼ばれるので
注意が必要です.


この方法でも,メイン画面に複数の <form> を
持つ画面の場合,メニューをインクルードした
<form> 以外をサブミットすると tree の状態が
失われます.

それが許容できない場合は,Teeda の tree を
使うよりも,JavaScript ライブラリのツリーを
使う方がいいように思います.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内