AngularJS: цикл по группам переключателей - PullRequest
0 голосов
/ 04 марта 2019

Я делаю анкету AngularJs.Я хочу показать задачи одну за другой.И каждое задание может иметь один или несколько вопросов с ответами переключателя.И я хочу сохранить пару вопрос + ответ в новом массиве.

Если я хочу показать только один вопрос для каждой задачи, я смог получить значения ответов из переключателей и вставить их в массив ответов.Но так как у меня есть несколько вопросов и несколько групп переключателей на странице, я не могу найти способ получить значения выбранных переключателей и вставить их в массив ответов.Я читал, что ng-модель может решить эту проблему, но я не мог понять, как.

Это то, что я имею до сих пор: https://jsfiddle.net/8qfom9th

<div ng-app="surveyApp" ng-controller="surveyCtrl">
<div ng-repeat="questionSet in questionSet">
    <div ng-if="question_index == $index">


          <div ng-repeat="onePageQuestions in questionSet.onePageQuestions">

            <div ng-repeat="question in onePageQuestions.question">
              {{question.description}}

              <form action="">

              <div ng-repeat="options in question.options">
                  <input type="radio" name="gender" ng-model="question.random" ng-value="options.answer"> {{options.answer}}
              </div>

            </form>

            </div>

          </div>

    </div>
</div>
<hr>
<button ng-click="next(); submitAnswers()">Next</button>

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Используйте parent.answer для ng-model для динамического переключателя.А для вашего случая использования я добавил одну saveAnswers функцию для манипулирования и сохранения ответов пользователей.

Ниже приведен код для демонстрационной версии вашего варианта использования, запустите его и посмотрите обновленный questionSet в консоли.

var app = angular.module('surveyApp', []);

app.controller('surveyCtrl', function($scope) {
  $scope.answer = '';
  $scope.saveAnswers = function(description, options) {
    $scope.questionSet.map(function(value, key) {
      value.onePageQuestions.map(function(item, index) {
        item.question.map(function(question, count) {
          if (question.description === description.description) {
            question.answer = options;
          }
        })

      })
    })
  }
  $scope.questionSet = [{
      onePageQuestions: [{
        question: [{
            description: 'question#1?',
            answer: '',
            options: [{
              answer: 'answer#1'
            }, {
              answer: 'answer#2'
            }, {
              answer: 'answer#3'
            }]
          },

          {

            description: 'question#2?',
            answer: '',
            options: [{
              answer: 'answer#4'
            }, {
              answer: 'answer#5'
            }, {
              answer: 'answer#6'
            }]
          }
        ]

      }]


    },


    {

      onePageQuestions: [{

        question: [{
          description: 'question#3?',
          answer: '',

          options: [{
            answer: 'answer#7'
          }, {
            answer: 'answer#8'
          }, {
            answer: 'answer#9'
          }]
        }]

      }]

    }




  ];

  $scope.question_index = 0;

  $scope.next = function() {

    if ($scope.question_index >= $scope.questionSet.length - 1) {
      $scope.question_index = 0;
    } else {
      $scope.question_index++;
    }

  };

  $scope.submitAnswers = function() {
    console.log($scope.questionSet)
  }



});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

<div ng-app="surveyApp" ng-controller="surveyCtrl">
  <div ng-repeat="questionSet in questionSet">
    <div ng-if="question_index == $index">


      <div ng-repeat="onePageQuestions in questionSet.onePageQuestions">

        <div ng-repeat="question in onePageQuestions.question">
          {{question.description}}

          <form action="">

            <div ng-repeat="options in question.options">
              <input ng-change="saveAnswers(question,options.answer)" type="radio" name="gender" ng-model="$parent.answer" ng-value="options.answer"> {{options.answer}}
            </div>
          </form>

        </div>

      </div>

    </div>
  </div>
  <hr>
  <button ng-click="next()">Next</button>
  <button ng-click="submitAnswers()"> Submit</button>

Надеюсь, это поможет вам!

0 голосов
/ 05 марта 2019

Это на самом деле довольно простой друг.

Вы можете получить значение выбранной кнопки, используя свойство checked.Поскольку из группы можно выбрать только одну радиокнопку, вы сможете легко получить значение выбранного с помощью этого свойства в цикле if внутри javascript.

  • Поскольку вы уже дали options переключателей name, то есть пол .Вы можете просто получить все элементы option s, используя следующее:

    var options = document.getElementsByName('gender');
    var option_value; //to get the selected value
    
  • Следующим шагом является цикл по всем кнопкам и проверка, какая из них выбрана ..Для их обхода используйте цикл for следующим образом: for (var i = 0; i < options.length; i++) {...}

    Чтобы проверить, выбран он или нет, используйте атрибут checked следующим образом:

    if (options[i].checked) {
        option_value = options[i].value;
    }
    

Я не уверен, что вы намереваетесь делать с этими значениями, поэтому я предположил, что вам нужно отобразить их и для этого просто создать другой элемент, например <div>, и присвоить ему идентификатор.А затем просто добавьте значение выбранного параметра к этому элементу.Должно быть что-то вроде этого:

HTML: <div id="selected">The selected options are:</div>

JS: document.getElementById('selected').innerHTML += "<br>" + option_value;

Обновлен скрипка .

Или, если вы хотите проверить это прямо здесь, вот обновленный код:

var app = angular.module('surveyApp', []);

app.controller('surveyCtrl', function($scope) {
  $scope.questionSet = [{

      onePageQuestions: [{

        question: [{
            description: 'question#1?',

            options: [{
              answer: 'answer#1'
            }, {
              answer: 'answer#2'
            }, {
              answer: 'answer#3'
            }]
          },

          {

            description: 'question#2?',
            options: [{
              answer: 'answer#4'
            }, {
              answer: 'answer#5'
            }, {
              answer: 'answer#6'
            }]
          }
        ]

      }]


    },


    {

      onePageQuestions: [{

        question: [{
          description: 'question#3?',

          options: [{
            answer: 'answer#7'
          }, {
            answer: 'answer#8'
          }, {
            answer: 'answer#9'
          }]
        }]

      }]

    }




  ];

  $scope.question_index = 0;

  $scope.next = function() {
    if ($scope.question_index >= $scope.questionSet.length - 1) {
      $scope.question_index = 0;
    } else {
      $scope.question_index++;
    }

  };

  $scope.submitAnswers = function() {

    var options = document.getElementsByName('gender');
    var option_value;
    for (var i = 0; i < options.length; i++) {
      if (options[i].checked) {
        option_value = options[i].value;
        document.getElementById('selected').innerHTML += "<br>" + option_value;
      }
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="surveyApp" ng-controller="surveyCtrl">
  <div ng-repeat="questionSet in questionSet">
    <div ng-if="question_index == $index">


      <div ng-repeat="onePageQuestions in questionSet.onePageQuestions">

        <div ng-repeat="question in onePageQuestions.question">
          {{question.description}}

          <form action="">

            <div ng-repeat="options in question.options">
              <input type="radio" name="gender" ng-model="question.random" ng-value="options.answer"> {{options.answer}}
            </div>

          </form>

        </div>

      </div>

    </div>
  </div>
  <hr>
  <button ng-click="next(); submitAnswers()">Next</button>
  <hr>
  <div id="selected">The selected options are:
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...