フィールド値を比較したい

こんにちは。

以前、フィールドの値を比較したいと投稿し、実装はできたのですが、

差分を見ているフィールドとは別のフィールドにエラーメッセージを出すようにしたいです。

下記のどこを編集したら可能になりますでしょうか。

(function() {

  'use strict';

  fb.addValidators = function(state) {
    return {
      max_validation: {
        // エラーメッセージ内容
        getMessage: function(fieldCode, params) {
           return 'Bと同じものを選択してください';
        },
        // エラー判定条件
        validate: function(value, params) {
          // valueは注文数と同値
          // A <> B の場合はエラー
          if (value != state.record.FeildA.value) {
            return false;
          }
          return true;
        }
      }
    }
  };

  fb.events.form.created = [function(state) {
    // 全フィールドからエラーを出したいフィールドを検索
    state.fields.filter(function(field) {
      // エラーを出したいフィールドコード
      return field.code == 'FeildB';
    })[0].validations.push({
      params: [],
      rule: 'max_validation' // fb.addValidatorsで定義した中から適用したいバリデーション名
    });
    return state;
  }];

})();

meariさん

こんにちは。

 

例えば、フィールドBではなくフィールドAにエラーを出したいということでしょうか。

以下にエラーメッセージを出したいフィールドコードを指定します。

// エラーを出したいフィールドコード
return field.code == 'フィールドA';

 

値の比較は必ずしもvalueを使わなくても良いです。

別フィールドの値でも良いですし、何かしらの変数や固定値でも良いです。

// A <> B の場合はエラー
if (state.record.フィールドA.value != state.record.フィールドB.value) {
  return false;
}

 

フィールドAとBを比較しますが、エラーはCに出したい場合は以下のようになります。

// エラーを出したいフィールドコード
return field.code == 'フィールドC';

koichi様

お世話になっております。。

AとBを比較し、Cにエラーを出したかったので、いただいたものを参考に試してみたのですが、

エラーメッセージがでませんでした。何か間違っているのでしょうか?

(function() {

  'use strict';

  fb.addValidators = function(state) {
    return {
      max_validation: {
        // エラーメッセージ内容
        getMessage: function(fieldCode, params) {
        return 'Bと同じものを選択してください';
        },
        // エラー判定条件
        validate: function(value, params) {
          // valueは注文数と同値
          // 注文数 > 在庫数 の場合はエラー
        if (state.record.A != state.record.B) {
            return false;
          }
          return true;
        }
      }
    }
  };

  fb.events.form.created = [function(state) {
    // 全フィールドからエラーを出したいフィールドを検索
    state.fields.filter(function(field) {
      // エラーを出したいフィールドコード
      return field.code === 'C';
    })[0].validations.push({
      params: [],
      rule: 'max_validation' // fb.addValidatorsで定義した中から適用したいバリデーション名
    });
    return state;
  }];

})();

紛らわしい書き方だったかもしれません。

 

フィールドコードの後のvalueは必要です。

if (state.record.A.value != state.record.B.value) {

 

以下の左辺のようなvalueは必ずしも使わなくても良いですよ、という意味でした。

上記コードの場合は、「state.record.C.value != state.record.A.value」と同じ意味になるため。

if (value != state.record.A.value) {

 

ご指摘のあった個所を書き換えて試してみたのですが、エラーが出ませんでした。。

他の箇所にも書き換えたことでの問題があるのでしょうか。。

フィールドCを変更した時や回答(確認)ボタンを押したときにエラーは表示されますか?

このタイミングでしか価判定が行われませんので、フィールドA・Bを変更しただけではエラーが出ません。

失礼しました。

こちらの問題だったようです。無事反映することができました!

お時間いただきましてありがとうございます。

ルックアップでも問題なく処理できるはずなのですが、全体像としては以下のようになると思います。

 

都道府県手入力Aに値を入れた後、ルックアップでB・Cが入った際にA・Cを比較して値が異なればCにエラーが出ます。

(function() {

    'use strict';

    fb.addValidators = function(state) {
        return {
            validation: {
                // エラーメッセージ内容
                getMessage: function(fieldCode, params) {
                    return '都道府県が異なります。';
                },
                // エラー判定条件
                validate: function(value, params) {
                    if (state.record.都道府県手入力A.value != state.record.都道府県ルックアップB.value) {
                        return false;
                    }
                    return true;
                }
            }
        }
    };

    fb.events.form.created = [function(state) {

        // 全フィールドからエラーを出したいフィールドを検索
        state.fields.filter(function(field) {
            // エラーを出したいフィールドコード
            return field.code === '市区町村ルックアップC';
        })[0].validations.push({
            params: [],
            rule: 'validation' // fb.addValidatorsで定義した中から適用したいバリデーション名
        });

        return state;

    }];

})();

 

解決されましたね。良かったです。

ご丁寧にありがとうございました。

恐縮ですが、もうひとつご教示いただきたく…

上記で実装できたコードを同じフォーム上で量産する場合は、

それぞれでファイルを作成して取り込めば実現可能なのでしょうか?

同じフォームの他のフィールドでもエラーチェックを行うという認識で合っていますか?

 

同じJSファイルに処理を追記すると良いです。

バリデーション名を自由に設定できますので「validation_1」「validation_2」という名前で条件判定を用意しておき

フィールドAにはvalidation_1の結果、フィールドBにはvalidation_2の結果でエラーメッセージを出すということが可能です。

 

(function() {

    'use strict';

    fb.addValidators = function(state) {
        return {
          validation_1: {
                // エラーメッセージ内容
                getMessage: function(fieldCode, params) {
                  return 'エラーメッセージ1';
                },
                // エラー判定条件
                validate: function(value, params) {
                  // 略
                }
          },
validation_2: {
                // エラーメッセージ内容
                getMessage: function(fieldCode, params) {
                return 'エラーメッセージ2';
                },
                // エラー判定条件
                validate: function(value, params) {
                  // 略
                }
            }
        }
    };

    fb.events.form.created = [function(state) {

        // 全フィールドからエラーを出したいフィールドを検索
        state.fields.filter(function(field) {
            // エラーを出したいフィールドコード
          return field.code === 'フィールドA';
        })[0].validations.push({
            params: [],
          rule: 'validation_1' // fb.addValidatorsで定義した中から適用したいバリデーション名
        });

// 全フィールドからエラーを出したいフィールドを検索
        state.fields.filter(function(field) {
            // エラーを出したいフィールドコード
        return field.code === 'フィールドB';
        })[0].validations.push({
            params: [],
          rule: 'validation_2' // fb.addValidatorsで定義した中から適用したいバリデーション名
        });

        return state;

    }];

})();

再度のご教示ありがとうございます。

想定していたものができました!

お時間いただきありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。