@gymnastdeveloper

Как обновить массив в scope родительского контроллера при открытом модальном окне (Angular UI Bootstrap Modal)?

Всем доброго времени суток.

Столкнулся с одной проблемой после рефакторинга кода бэкенда к приложению Системы тестирования. Тест представляет собой список вопросов с несколькими вариантами ответов, при этом один и только один вариант ответа является верным.

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

По дизайну добавление и редактирование вопросов и ответов происходит в модальном окне (Angular UI Boostrap Modal). Шаблон расположен отдельно и не повторяется при вставке каждого вопроса и ответа. Когда данные с формы не валидны, показываются ошибки валидации, в противном случае показывается сообщение об успешном сохранении, и все поля формы сбрасываются в свое начальное состояние. Все это происходит при открытом модальном окне, закрыть его можно только по нажатию кнопки "Отмена", крестика или Esc.

Мне нужно обновить $scope.questions в QuestionsCtrl из модального окна (кнопка добавления также находится внутри модального окна). После однократного нажатия кнопки данные обновляются, однако сообщение об успехе или ошибки валидации не показываются, и поля формы не возвращаются в первоначальное состояние. Повторные клики больше не вызывают функцию, т.е. она выполняется только один раз.

Без модального окна, но со вложенными контроллерами все работает, как и хотелось.

Есть вариант использовать promise result, но для него обязательно закрывать модальное окно, тут же сама идея такова, что менеджер может добавить сколько угодно вопросов и ответов без переоткрывания окна.

Пробовал также Angular Strap, результат тот же.

Важный момент - с каждым запросом на добавление / редактирование в модальном окне шлется актуальный список вопросов и ответов в json, после чего происходит полное переприсвоение $scope.questions. Может это не лучший вариант, но так делалось для того, чтобы менеджеры всегда работали только с актуальной информацией (случаи одновременного редактирования одного теста), а также для редактирования в разных вкладках и браузерах одним человеком (это уже гораздо менее вероятно, но тем не менее, может привести к коллизиям).

Проблемное место было выявлено - оно кроется как раз в обновлении $scope.questions.
Обновление происходит путем полного переприсвоения, если добавлять новые элементы просто через push, проблем нет.
Проход по массиву, пришедшему с сервера со сравнением и удалением / добавлением новых элементов в зависимости от изменений - на мой взгляд, плохая идея.
Но даже если не переприсваивая, удалить все элементы из массива и потом последовательно в цикле добавить новые, проблема остается.
Если говорить более конкретно, как только массив становится пустым, то и возникает данная ошибка.

Я создал Plunk, оставил только самое необходимое для лучшего понимания проблемы.

Собственно вопрос, как при открытом модальном окне, при нажатии кнопочки "Добавить" корректно в фоне обновлять массив $scope.questions?
  • Вопрос задан
  • 2889 просмотров
Пригласить эксперта
Ответы на вопрос 1
4ikist
@4ikist
Используйте общие данные через factory, передайте в scope модального окна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы