Frage

Ich bin nicht pro Angular und bin immer noch lernend. Ich hoffe, ich bekomme hier Hilfe.

Ich möchte eine App mit unterschiedlichen Ansichten erstellen. Ich muss den Browser erkennen und auch einige Daten von einem Server abholen. Dafür habe ich einen Dienst erstellt, in dem ich diese Arbeit mache.

Mein Wunsch ist es, die Daten des Dienstes alle Ansichten zu verwenden. Wie ist der richtige Weg, um die Daten zu speichern und zu speichern, damit ich sie in allen meinen Ansichten/Controllern verwenden kann?
Hier ist, was ich so weit habe.

Mein Service:

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

Mein Controller:

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

Lösung

Wie Nordyke in seiner Antwort erwähnte, sollten Sie den Service zunächst auf kleinere teilen.

Zweitens fragen Sie, wie Sie die Daten zwischengespeichern können, und da Sie Versprechen verwenden, $q.when() ist was du brauchst. Ich werde das nehmen getPlatform Als Beispiel, um Ihnen den Einstieg zu erleichtern:

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

Auf diese Weise werden die Betriebssysteminformationen zwischengespeichert, und

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

wird die Plattforminformationen nur einmal während der Lebenszeit des DataService abrufen. Sie können dieselbe Idee auf die gleiche Idee anwenden getServerData auch um die Daten vom Server zu zwischenstrahlen.

Andere Tipps

Das Zwischenspeichern Ihrer Daten in einem Dienst Singleton ist ein guter Ansatz, und ich mag Ihre einfache Implementierung. Meine einzige Empfehlung wäre, Ihre drei Bedenken in separate Dienste aufzuteilen.

  1. Browsererkennung
  2. Serveranfragen (die noch mehr aufgeteilt werden, sobald Sie mehr Anfragen haben.)
  3. Daten zwischen den Daten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top