@imelos

Запрос данных в фабрике из нескольких контроллеров?

Имеется простой шаринг данных между контроллерами

.factory('Games', function () {
        var games = {
                 list: []
            }
        return {
            get: getGames,
            set: setGames,
        };

        function getGames() {
            return games;
        }
        function setGames(gamesList) {
            games.list = gamesList;
        }
 })

Дальше контроллеры используют эту фабрику чтобы взять данные

.controller('MyCtrl1', function($scope,Games){
        $scope.games = Games.get()   
    });
 .controller('MyCtrl2', function($scope,Games){
        $scope.games = Games.get()   
    });
и так далее

Данные я получаю из API запроса. Соответственно я смотрю в контролерах

.controller('MyCtrl1', function($scope,Games,$http){
        $scope.games = Games.get()
        // если нету данных в фабрике - запросить их и засетить
        if (!$scope.games.list.length) {
            $http(....).then(function(response)) {
                 Games.set(response.data)
             }
        }
    });

И так во всех конроллерах.
Из за этого возникает проблема, если я имею на странице несколько таких контроллеров то все они одновременно запрашивают данные.

Как решить данную проблему? Возможно запрашивать данные в фабрике? Как это правильнее организовать, чтобы все обошлось одним запросом на сервер.
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
@lega
Данные с сервера должна запрашивать фабрика, например при создании (если в течении работы данные не меняются), фабрика создает "синглтон" поэтому загрузчик на старте выполнится только 1 раз.

Если нужно получить данные в контроллере, а в фабрике их ещё нет, тогда getGames должен быть асинхронным (например возвращать Promise).
Если данные меняются с течением времени и контроллер должен на это реагировать, тогда можно сделать что-б фабрика рассылала pubsub сообщение о новых данных, а контроллеры на это реагировали и запрашивали Games.get() заново.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы