LoginSignup
5
4

More than 5 years have passed since last update.

いずれかひとつが必須のチェックボックス群

Posted at

概要

「複数あるチェックボックスのうち、最低ひとつを選んでください。」みたいなのよくやりますよね?

探し方が悪かったのか、もっといいものがあるのに頑張って実装してしまいました。
(;-;)

悲しいので何かの参考代わりに置いておきます。

もっといいもの

こちらのほうが、機能充実。見た目もよいです。

コードの屍

一応使い方

<input type="checkbox" checkbox-group="enqBring" name="enqBring" >Search engine
<input type="checkbox" checkbox-group="enqBring">SNS
<input type="checkbox" checkbox-group="enqBring">Email newsletter

ソースコード

angular-checkbox-group.js
/* 
 * (C) 2014
 * 最低ひとつのチェックをrequireする
 * <p>
 * usage:
 * <pre>
 * &lt;input type="checkbox" name="opt" checkbox-group="optgroup"&gt;
 * &lt;input type="checkbox" checkbox-group="optgroup"&gt;
 * &lt;input type="checkbox" checkbox-group="optgorup"&gt;
 * </pre>
 */
angular.module('checkbox-group', []).directive('checkboxGroup', [
    '$parse', '$log',
    function ($parse, $log) {
        $log.debug('initializing checkboxGroup directive.');

        var linkFn = function (scope, element, attrs, ctrl) {
            $log.debug('checkboxGroup linkFn called.');

            var representCtrlGetter = $parse(attrs.checkboxGroup + 'RepresentCtrl');
            var representCtrlSetter = representCtrlGetter.assign;
            var getter = $parse(attrs.checkboxGroup);
            var setter = getter.assign;
            var count = getter(scope.$parent);

            if (typeof count === 'undefined') {
                count = 0;
                setter(scope.$parent, count);
                $log.debug('initialized number of checked boxes to 0.');
            }

            /* save a represent control of checkboxes group */
            if (ctrl.$name) {
                $log.debug('saving a represent control.');

                if (typeof representCtrlGetter(scope.$parent) !== 'undefined') {
                    throw 'only one checkbox can have NAME attribute.';
                }

                representCtrlSetter(scope.$parent, ctrl);
            }

            ctrl.$validators.requiredCheckbox = function (modelValue, viewValue) {
                $log.debug('checkboxGroup validator called.');
                var count = getter(scope.$parent);

                if (viewValue === true) {
                    count += 1;
                } else if (count > 0 && viewValue === false) {
                    count -= 1;
                }
                setter(scope.$parent, count);

                $log.debug('number of checked boxes is: ' + count);

                representCtrlGetter(scope.$parent).$setValidity('requiredCheckbox', (count > 0));

                return (count > 0);
            };
        };

        return {
            restrict: 'A',
            require: 'ngModel',
            scope: true,
            link: linkFn
        };
    }]);



5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4