Проверка группы флажков Angularjs (динамические параметры)

Допустим, у меня есть этот объект вопроса:

$scope.question = {
    id: 1,
    question: 'q?',
    required: true,
    control: {
        type: 'multiple_check',
        options: [{
            value: '1st option'
        }, ... ]
    }
}

И эта форма:

<form name="s.form" novalidate>
    <h1>{{ question.question }}</h1>
    <label ng-repeat="option in question.control.options">
        <input type=" name="xxx"
            ng-model="question.answer[$index]" ng-required="question.required" />
        {{ option.value }}
    </label>
</form>

И я застрял сейчас с проверкой.

Я создал ручку для этого.

{{s.form. $ valid}} должен давать мне true, когда форма верна, но возвращает true только тогда, когда отмечены все флажки в группе.

{{ s.form['xxx'].$valid }} должен давать мне значение true, когда установлен хотя бы один флажок, но на самом деле он возвращает значение true, только если установлен последний флажок

Я хочу иметь возможность выбрать хотя бы один флажок (один или несколько) из группы. Если хотя бы один из них отмечен, форма и группа будут действительными.

Как я могу этого достичь? Уже много чего перепробовал, но не могу заставить это работать.

Благодарю.

2 ответа

Вы можете сделать свою собственную проверку, установив флажок ниже

$scope.$watch( "question.control.options" , function(n,o){
    var trues = $filter("filter")( n , {value:true} );
    $scope.flag = trues.length;
}, true );

Примечание: значение флажка должно быть логическим, поэтому измените значение вашего вопроса как

$scope.question = {
    id: 1,
    question: 'q?',
    required: true,
    control: {
        type: 'multiple_check',
        options: [{
            value: false,
            label: '1st option'
        }, ... ]
    }
}

и ваш взгляд как

<form name="s.form" novalidate>
    <h1>{{ question.question }}</h1>
    <label ng-repeat="option in question.control.options">
        <input type=" name="xxx"
        ng-model="question.control.options.value" ng-required="question.required" />
        {{ option.label }}
    </label>
</form>

вот скрипка такой подход

Это было на самом деле сложно, но я думаю, что это работает сейчас. Вот рабочая демка

Для тех, кто хочет знать, я включил этот модуль в свое приложение.

Затем изменил код HTML на:

<form name="s.form" novalidate>

   form valid? <b>{{ s.form.$valid | json }}</b>

   <div ng-repeat="question in questions">
        <h1>{{ question.question }}</h1>
        <label ng-repeat="option in question.control.options">
            <input type="checkbox" name="xxx_{{ question.id }}"
            checklist-model="question.answer" checklist-value="option" ng-required="question.required && !question.answer.length" />
            {{ option.value }}
        </label>

        <p>question valid? {{ s.form['xxx_'+question.id].$valid | json }}</p>
        answer: {{ question.answer }}
    </div>

</form>
Другие вопросы по тегам