Domanda

Non sono professionista in Angular e sto ancora letando. Spero di avere un po 'di aiuto qui.

Voglio creare un'app con visualizzazioni diverse. Devo rilevare il browser e anche prendere alcuni dati da un server. Per questo ho creato un servizio, dove faccio questo lavoro.

Il mio desiderio è di utilizzare i dati del servizio tutte le viste. In che modo è il modo corretto di archiviare e memorizzare nella memorizzazione nella cache i dati in modo da poterli utilizzare in tutte le mie visualizzazioni/controller?
Ecco cosa ho ottenuto così lontano.

Il mio servizio:

.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;
    }
};
});

Il mio controller:

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

Soluzione

Prima di tutto, come ha detto Nordyke nella sua risposta, è meglio dividere il servizio a quelli più piccoli.

In secondo luogo, stai chiedendo come memorizzare nella cache i dati e dal momento che stai usando Promise, $q.when() è ciò di cui hai bisogno. Prenderò il getPlatform Come esempio per iniziare:

.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
            };
        }
    };
});

In questo modo, le informazioni sul sistema operativo sono memorizzate nella cache e

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

Prenderà le informazioni della piattaforma solo una volta durante la vita del dati dati. Puoi applicare la stessa idea a getServerData Inoltre per memorizzare nella cache i dati dal server.

Altri suggerimenti

La memorizzazione nella cache dei tuoi dati in un singleton di servizio è un buon approccio e mi piace la tua semplice implementazione. La mia unica raccomandazione sarebbe quella di dividere le tue 3 preoccupazioni in servizi separati.

  1. Rilevamento del browser
  2. Richieste del server (che verranno divise ancora di più una volta che avrai più richieste.)
  3. Cache dei dati
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top