Flexアプリケーションのコンテナの動的な最小の高さに問題があります。
アプリケーションはいくつかのタブで構成されており、各タブには必要に応じて独自のminHeight属性が設定されています。ただし、1つのタブで、リストビューと詳細ビューの2つのビューを切り替えます。
メインビュー:
<mx:TabNavigator id="tabNavigator" width="100%" height="100%" change="MainViewModel.getInstance().onTabClick(event);" resizeToContent="true">
<s:NavigatorContent label="Welcome" minWidth="950" width="100%" minHeight="300" height="100%">
<startview:StartView width="100%" height="100%" x="0" y="0" />
</s:NavigatorContent>
<s:NavigatorContent id="documentTab" minWidth="950" width="100%" minHeight="300" height="100%" label="Document">
<documentview:DocumentView width="100%" x="0" y="0" visible="{model.documentList}" />
<documentdetailview:DocumentDetailView width="100%" x="0" y="0" visible="{model.documentDetail} "/>
</s:NavigatorContent>
</mx:TabNavigator>
リストには、関数setDocumentDetailView()を呼び出す「詳細」リンクのある列があります。
public function setDocumentDetailView() : void {
documentList = false; // the list is not displayed
documentDetail = true; // the detail is displayed
}
詳細ビューには、関数setDocumentListView()を呼び出すリストに戻るためのボタンがあります。
public function setDocumentListView() : void {
documentList = true; // tje
documentDetail = false;
setDocumentDetailViewHeight(300);
}
これまでのところ、正常に動作します。
リストの最小の高さと詳細が異なるため、最初の問題が発生します。垂直スクロールバーを表示し、特定のビューのすべてのコンテンツを表示するには、NavigatorContent id="documentTab"の最小の高さを設定する必要があります。これは、上記の関数で実行されます。
詳細は表示されるドキュメントに依存するため、さらに多くの問題が発生します。条件付きの可視性を備えたいくつかのパネルで構成されています。したがって、最小の高さはさまざまなドキュメントで異なります(ドキュメントのタイプとテキストの長さによって異なります)。したがって、内容に応じてminHeightを決定し、それに応じて「documentTab」のminHeightを設定する必要があります。
ビューがレンダリングされた後に呼び出される「updateComplete」イベントを見つけました。すべての条件付きパネルを含むVGroupの高さの値を取得した場合、外側のNavigatorContent"documentTab"に設定する必要のある正しい高さがあります。この高さを、タブのminHeightを設定するMainModelの関数に渡します。
public function onUpdateComplete(): void {
if (MainViewModel.getInstance().documentDetail) {
height = view.documentDetail.height;
MainViewModel.getInstance().setDocumentDetailViewHeight(height);
}
}
これも正しく機能しているようです。それまで ...
私は最近、次のシナリオに従うと失敗することを知りました。
- ドキュメントのリストを表示します。
- ドキュメントAの詳細を表示します。
- リストに戻ります。
- 同じドキュメントAを表示します。
この場合、表示されるオブジェクトは同じ高さと幅で同じであるため、詳細ビューは再レンダリングされません。したがって、updateCompleteイベントはトリガーされず、minHeightは300に設定されたままになります(前の手順でリストminHeightが設定されているため)。詳細のパネルは外側の「documentTab」を越え、スクロールバーは表示されません。同様のコンテンツ(同じパネルが表示され、同じ比率)を持つ別のドキュメントに移動すると、同じ状況が発生します。
誰かがこの状況のための実用的な解決策を持っていますか?
「show」イベントでさえ、属性に格納されている値に高さを設定することをすでに試しました。しかし、それは機能しませんでした。さらに悪いことに、「height」変数の値が以前よりも大きい値に設定されただけで、決して小さく設定されなかったため、実際に奇妙な動作をし始めました。ビューが小さくなる可能性がある場合、変数は前のサイズの値を保持しました。そして、ビューがより高い高さを必要とするとき、変数は新しいより高い値を取りました。これにより、さまざまなドキュメントの詳細にアクセスし、この大きな高さを維持しながら、ビューを検出された最大サイズに永続的にサイズ変更しました。すべてのドキュメントの詳細に多くの空きスペースとスクロールバーがあります。
私はFlexのこの予測不可能な動作に本当にうんざりしています:(だから、誰かが私がこの仕事をするために何を試みるべきかについての考えを持っているなら、私は本当に幸せです。