Служба AngularJS возвращает ответ на неправильный экземпляр контроллера - PullRequest
0 голосов
/ 12 ноября 2018

[ПРИМЕЧАНИЕ. Поскольку я не совсем уверен, с чего начать поиск проблемы, на данный момент я не включаю пример кода.В зависимости от комментариев / предложений я отредактирую этот пост и добавлю все необходимое]

Мы работаем над веб-приложением SPA (AngularJS) и недавно наблюдали странное поведение (по-видимому, оно естьс самого начала но только сейчас это было обнаружено).Приложение разработано для работы с несколькими вкладками, каждая вкладка специализируется на конкретном типе данных и содержит кнопку «Обновить» для повторной загрузки данных из БД.Например, есть вкладка, которая служит для создания и обновления профилей пользователей, и вторая вкладка для создания и обновления пользователей.Каждой вкладке назначается собственный (с другим именем) контроллер.

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

Проблема начинается, когда открыты две вкладки одного типа (скажем, два экземпляра вкладки «Профили пользователей»):

  • Запрос к БД, запущенный изнутри первойОткрытая вкладка (экземпляр) получена во втором экземпляре.
  • Запрос к БД, запущенный изнутри второй открытой вкладки (экземпляр), ТАКЖЕ получен во втором экземпляре.
  • Когда второйЭкземпляр закрыт, любые дополнительные запросы из первой вкладки не получают ответа.

Мне кажется, что второй экземпляр каким-то образом переопределяет указатель на функцию обещания (которая вызывается, как только ответ отБД прибывает).Один простой тест, который мы сделали, чтобы подтвердить эту гипотезу, заключался в использовании уникального идентификатора каждой вкладки.Консольный вывод был добавлен в код непосредственно перед запуском поиска в БД и при получении ответа.Результатом было то, что инициирующий запрос от Tab_ID = 0 был получен в пределах Tab_ID = 1.

1 Ответ

0 голосов
/ 13 ноября 2018

(Опубликован ответ от имени автора вопроса) .

Я только что нашел решение, на самом деле очень простое: сделать функцию обещания частью $scope контроллера. Вот и все!

Чтобы прояснить решение, функция начального обещания выглядела следующим образом:

 Handle_Server_Response = function (data) {...}

и указатель обратного вызова был передан следующим образом:

Get_Data_From_Sarver(<arguments>...,Handle_Server_Response) ;

Новый код теперь выглядит следующим образом:

 $scope.Handle_Server_Response = function (data) {...}

и указатель обратного вызова теперь передается следующим образом:

Get_Data_From_Sarver(<arguments>...,$scope.Handle_Server_Response) ;

Это очень простое изменение гарантирует, что функции обратного вызова находятся в правильной области действия экземпляра контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...