選択肢の絞り込み

最終更新日: 2022年11月16日
R8 | R9

次のモデル参照項目を用意するものとします。

(a) アカウント(juser)を参照し、リストボックスとして扱う項目。
(b) グループ(jgroup)を参照し、リストボックスとして扱う項目。

ここで (b) の選択肢に、(a) が所属するグループのみを表示する設定を行うものとします。

新規登録画面の初期状態は次の通りです。
(※「グループID (隠し項目)」は本来は隠しとするものですが、内容確認のために表示させています。)
二つのリストボックスはいずれも "未選択" となっています。

サンプルアプリケーション新規登録画面(1)

アカウントを選択します。

サンプルアプリケーション新規登録画面(2)

アカウントに紐づくグループは参照連動項目「グループID(隠し項目)」に反映されます。
さらに、これが「所属グループ」項目のリストボックスの選択肢になっています。

サンプルアプリケーション新規登録画面(3)

アカウントを選択しなおしたとき、グループの選択肢も変更されます。

サンプルアプリケーション新規登録画面(4)

定義方法

サンプルモデルの定義を示します。

サンプルモデルの定義(1)

アカウント

アカウント項目は アカウント(juser)モデルをリストボックスとして参照しています。

サンプルモデルの定義(2)

また、この項目では「入力制御 > 共通 > 値変更時に画面を再描画する」を有効にします。

値変更時に画面を再描画する設定

グループID(隠し項目)

アカウントに紐づく所属グループを参照連動する項目です。この項目はチェックボックスとなります。

グループID(隠し項目)の定義

この項目は隠し項目とします。

隠し項目とする

所属グループ

参照連動項目とは別に、所属グループをリストボックスとして用意します。

所属グループの定義

参照連動項目(jgroupid)を、リストボックス項目(group)に転記するためのスクリプトを用意します。このスクリプトは Wagby 内部で、ストアモデルからプレゼンテーションモデルを作成するタイミングで呼び出されます。

スクリプトの定義
if (sample_p === null) {
    return;
}
// 選択されたアカウントの所属グループIDを jgroupids に格納する。
var jgroupids = new java.util.ArrayList();
var userid = null;
var accountArry = sample_p.account;
for (var i=0; i < accountArry.length; i++) {
    if (accountArry[i].choose) {
        userid = accountArry[i].id;
        break;
    }
}
var entityService = p.appctx.getBean("JuserEntityService");
var juser = entityService.findById(userid);
if (juser === null) {
    return;
}
var jgroupids = new java.util.ArrayList();
for(var i=0; i < juser.jgroupid.length; i++) {
    jgroupids.add(juser.jgroupid[i]);
}
// 所属グループIDを持つ選択肢と「(未選択)」を groups に格納する。
var groups = new java.util.ArrayList();
for(var i=0; i < sample_p.group.length; i++) {
    var element = sample_p.group[i];
    if (element.noId // 「(未選択)」選択肢
        || jgroupids.contains(element.id)) {
        groups.add(element);
    }
}
// groups を配列に変換して sample_p.group にセットする。
var groupArry = Java.type("jp.jasminesoft.wagby.model.sample_p.Group[]");
sample_p.group = groups.toArray(new groupArry(groups.size));