Обновление структуры данных в angularJS на основе других структур данных
Я только что вошел в angularJS и для своего первого проекта я пытаюсь создать создателя викторины. Я хочу, чтобы люди могли создавать результаты, вопросы, ответы и взвешенное отображение ответов на результаты. Мой HTML выглядит так:
<div ng-controller="QuizCtrl">
<div class="result" ng-repeat="result in quiz.results">
<input ng-model="result.title" /> [<a href ng-click="quiz.results.splice($index, 1)">X</a>]<br />
</div>
<div class="question row" ng-repeat="question in quiz.questions">
<div class="col-sm-4 col-md-4 col-lg-4">
<input ng-model="question.title" /> [<a href ng-click="quiz.questions.splice($index, 1)">X</a>]<br />
<a href ng-click="addAnswer($index)">add answer</a>
</div>
<div class="col-sm-8 col-md-8 col-lg-8">
<div class="answer" ng-repeat="answer in question.answers">
<input ng-model="answer.title" /> [<a href ng-click="question.answers.splice($index, 1)">X</a>]<br />
<div class="answerresult" ng-repeat="answerresult in answer.answerresults">
{{ quiz.results[$index].title }}:
<select ng-change="answerresult.result = $index" ng-model="answerresult.weight" ng-options="i for i in [1,2,3]"></select>
</div>
</div>
</div>
</div>
</div>
Базовая структура данных выглядит так:
angular.module('testApp')
.controller('QuizCtrl', function ($scope) {
$scope.quiz = {
questions: [
{title: 'question 1', answers: [
{title: 'answer 1', answerresults:[
{'result': 0, weight: 2},
{'result': 1, weight: 3}
]},
{title: 'answer 3', answerresults:[
{'result': 0, weight: 2},
{'result': 1, weight: 2}
]}
]},
{title: 'question 2', answers: [
{title: 'answer 1', answerresults:[
{'result': 0, weight: 1},
{'result': 1, weight: 2}
]},
{title: 'answer 2', answerresults:[
{'result': 0, weight: 2},
{'result': 1, weight: 2}
]},
{title: 'answer 3', answerresults:[
{'result': 0, weight: 1},
{'result': 1, weight: 3}
]}
]}
],
results: [
{title: 'result 1'},
{title: 'result 2'}
],
};
});
Теперь мои вопросы:
- Как мне обновить каждый массив "$scope.quiz.questions[x].answers[y].answerresults" при добавлении или удалении нового элемента в "$scope.quiz.results"? Конечно, подойдет вложенный цикл for, но это не очень элегантно. Есть ли лучший способ использовать угловое двустороннее связывание данных?
- Как мне представить связь между "$scope.quiz.questions[x].answers[y].answerresults[z].result" и "$scope.quiz.results[i]"? Прямо сейчас я просто установил это: ng-change="answerresult.result = $index" Обычная практика? Или есть способы получше?
- Вместо того, чтобы перебирать "$scope.quiz.questions[x].answers[y].answerresults" ", возможно, он мог бы работать для перебора" $ scope.quiz.results ", а затем динамически каким-то образом создавать массив answerresults для каждого ответа?
Заранее спасибо за ваши ответы и извините, если это глупые вопросы. Я просто нырнул в угловой вчера..
1 ответ
Хорошо, теперь я решил с помощью вложенного цикла for. Я не знаю, правильно ли это делать в angular, но это работает:
$scope.addResult = function() {
$scope.quiz.results.push({});
for(var question in $scope.quiz.questions ) {
for(var answer in $scope.quiz.questions[question].answers) {
$scope.quiz.questions[question].answers[answer].answerresults.push({});
}
}
};
$scope.removeResult = function(index) {
$scope.quiz.results.splice(index, 1);
for(var question in $scope.quiz.questions ) {
for(var answer in $scope.quiz.questions[question].answers) {
$scope.quiz.questions[question].answers[answer].answerresults.splice(index, 1);
}
}
};