選択肢の絞り込み

最終更新日: 2022年11月16日

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

(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));