複数のフィールドの値を組み合わせたエラーチェック

複数の数値フィールドが存在し,それらの和が100の場合のみ投稿を許可したいということでよろしいでしょうか.

実装方法を2つご提案させていただきます.1つめのほうが,プログラムの構造を理解するのは簡単かと思います.

※全てのブラウザで動作確認を行っておりません.ご利用前に,ご自身で確認をして頂ますよう,お願いします.

※GoogleChromeでのみ動作確認をしております.

 

□1つめ:

対象の数値フィールドの合計を計算する数値計算フィールドを用意(これは編集不可にしておく)し,このフィールドに対して独自の検証を追加します.

(function () {
  'use strict';
  fb.events.form.created.push(function (state) {
    state.fields.find(field => field.code === 'calc').validations.push({ // 'calc'には,対象となる数値計算フィールドのフィールドコードが入ります
      params: [],
      rule: 'calc_validation'
    });
    return state;
  });

  fb.addValidators = function (state) {
    return {
      calc_validation: {
        getMessage: function (fieldCode, params) {
          return '合計が100%である必要があります.';
        },
        validate: function (value, params) {
          return value === 100;
        }
      }
    };
  };
})();

 

□2つめ

複数のフィールドを組み合わせた独自の検証を加えるという方法です.対象のフィールドが2つある場合を書かせていただきます.

(function () {
  'use strict';
  const targetFields = ['number', 'number_1']; // 計算対象のフィールドらのフィールドコードを格納した配列

  fb.events.form.created.push(function (state) {
    targetFields.forEach(targetField => {
      state.fields.find(field => field.code === targetField).validations.push({
        params: [],
        rule: 'num_validation'
      });
    });
    return state;
  });

  fb.addValidators = function (state) {
    return {
      num_validation: {
        getMessage: function (fieldCode, params) {
          return '合計が100%である必要があります.';
        },
        validate: function (value, params) {
          var sum = 0;
          targetFields.forEach(targetField => sum += state.record[targetField].value);

          return sum === 100;
        }
      }
    };
  };
})();