Всем доброго времени суток.
Столкнулся с одной проблемой после рефакторинга кода бэкенда к приложению Системы тестирования. Тест представляет собой список вопросов с несколькими вариантами ответов, при этом один и только один вариант ответа является верным.
После дебага все работало нормально, но вся логика по управлению вопросами и ответами была расположена в одном контроллере. Я перенес логику ответов в отдельный вложенный контроллер, и после этого возникла проблема. Перепробовал много различных способов, пока безрезультатно.
По дизайну добавление и редактирование вопросов и ответов происходит в модальном окне (
Angular UI Boostrap Modal). Шаблон расположен отдельно и не повторяется при вставке каждого вопроса и ответа. Когда данные с формы не валидны, показываются ошибки валидации, в противном случае показывается сообщение об успешном сохранении, и все поля формы сбрасываются в свое начальное состояние. Все это происходит при открытом модальном окне, закрыть его можно только по нажатию кнопки "Отмена", крестика или Esc.
Мне нужно обновить $scope.questions в QuestionsCtrl из модального окна (кнопка добавления также находится внутри модального окна). После однократного нажатия кнопки данные обновляются, однако сообщение об успехе или ошибки валидации не показываются, и поля формы не возвращаются в первоначальное состояние. Повторные клики больше не вызывают функцию, т.е. она выполняется только один раз.
Без модального окна, но со вложенными контроллерами все работает, как и хотелось.
Есть вариант использовать promise result, но для него обязательно закрывать модальное окно, тут же сама идея такова, что менеджер может добавить сколько угодно вопросов и ответов без переоткрывания окна.
Пробовал также
Angular Strap, результат тот же.
Важный момент - с каждым запросом на добавление / редактирование в модальном окне шлется актуальный список вопросов и ответов в json, после чего происходит полное переприсвоение $scope.questions. Может это не лучший вариант, но так делалось для того, чтобы менеджеры всегда работали только с актуальной информацией (случаи одновременного редактирования одного теста), а также для редактирования в разных вкладках и браузерах одним человеком (это уже гораздо менее вероятно, но тем не менее, может привести к коллизиям).
Проблемное место было выявлено - оно кроется как раз в обновлении $scope.questions.
Обновление происходит путем полного переприсвоения, если добавлять новые элементы просто через push, проблем нет.
Проход по массиву, пришедшему с сервера со сравнением и удалением / добавлением новых элементов в зависимости от изменений - на мой взгляд, плохая идея.
Но даже если не переприсваивая, удалить все элементы из массива и потом последовательно в цикле добавить новые, проблема остается.
Если говорить более конкретно, как только массив становится пустым, то и возникает данная ошибка.
Я создал
Plunk, оставил только самое необходимое для лучшего понимания проблемы.
Собственно вопрос, как при открытом модальном окне, при нажатии кнопочки "Добавить" корректно в фоне обновлять массив $scope.questions?