Pergunta

Eu não sou profissional em Angular e ainda estou lernando. Espero receber ajuda aqui.

Eu quero criar um aplicativo com visualizações diferentes. Preciso detectar o navegador e também buscar alguns dados de um servidor. Para isso, criei um serviço, onde faço este trabalho.

Meu desejo é usar os dados do serviço todas as visualizações. Como é a maneira adequada de armazenar e armazenar os dados para que eu possa usá -los em todas as minhas visualizações/controladores?
Aqui está o que eu tenho até agora.

Meu serviço:

.factory('DataService', function($http, $q, $timeout) {
var data = { };
return {
    notes: function() {
        // This exposed private data
        return data;
    },
    addItem: function(itemname, itemvalue) {
        // This is a public function that modifies private data
        data[itemname] = itemvalue;
    }
    getPlatform: function() {
        var getPlatformData = function() {
          var deferred = $q.defer();
          BrowserDetect.init();
          deferred.resolve(BrowserDetect.OS);
            return deferred.promise;
        };
        return {
            getPlatformData: getPlatformData
        };
    },
    getServerData: function() {
        //if(!data.getServerData){
        var getData = function() {
            var deferred = $q.defer();
            $http({
                url: 'js/fakeGet.json',
                method: 'get',
                dataType: 'json',
            }).success(function(data) {
                data.scanResponse = data;
                deferred.resolve(data);
            })
            return deferred.promise;
        };

        return {
            getData: getData
        };
        //}
        // return data.scanResponse;
    }
};
});

Meu controlador:

DataService.getPlatform().getPlatformData().then(function(platform) {
    console.log('Another browserDetect request');
    $scope.platform = platform;
    DataService.addItem("platform", $scope.userPlatform);
});
Foi útil?

Solução

Primeiro de tudo, como Nordyke mencionou em sua resposta, é melhor dividir o serviço aos menores.

Segundo, você está pedindo como armazenar em cache os dados e, como você está usando promessa, $q.when() é o que você precisa. Vou levar o getPlatform Como exemplo para você começar:

.factory('DataService', function($http, $q, $timeout) {
    var os; // this variable is used to store the result

    return {
        getPlatform: function() {
            var getPlatformData = function() {
                if (!os) { // no previous data available, look into other service to fetch the data
                    var deferred = $q.defer();
                    BrowserDetect.init();
                    os = BrowserDetect.OS; // store data
                    deferred.resolve(os);
                    return deferred.promise;
                }
                return $q.when(os); // there is previous data, return it as promise
            };
            return {
                getPlatformData: getPlatformData
            };
        }
    };
});

Dessa forma, as informações do sistema operacional são armazenadas em cache e

DataService.getPlatform().getPlatformData().then(function(platform) {
    ...
});

Só buscará as informações da plataforma uma vez durante a vida útil do DataService. Você pode aplicar a mesma ideia a getServerData também para armazenar em cache os dados do servidor.

Outras dicas

O armazenamento em cache de seus dados em um serviço de serviço é uma boa abordagem, e eu gosto da sua implementação direta dele. Minha única recomendação seria dividir suas três preocupações em serviços separados.

  1. Detecção do navegador
  2. Solicitações de servidor (que serão divididas ainda mais depois de receber mais solicitações.)
  3. Cache de dados
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top