質問

私はAngularのプロではなく、まだlerningしています。ここで助けが得られることを願っています。

さまざまなビューでアプリを作成したいです。ブラウザを検出し、サーバーからデータを取得する必要があります。このために、私はこの作業を行うサービスを作成しました。

私の願いは、サービスのすべてのビューのデータを使用することです。すべてのビュー/コントローラーで使用できるように、データを保存およびキャッシュする適切な方法はどのようにありますか?
これが私がこれまでに得たものです。

私のサービス:

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

私のコントローラー:

DataService.getPlatform().getPlatformData().then(function(platform) {
    console.log('Another browserDetect request');
    $scope.platform = platform;
    DataService.addItem("platform", $scope.userPlatform);
});
役に立ちましたか?

解決

まず第一に、Nordykeが彼の答えで述べたように、あなたはサービスをより小さなものに分割する方が良いでしょう。

第二に、あなたはデータをキャッシュする方法を求めています、そしてあなたは約束を使用しているので、 $q.when() あなたが必要とするものです。私は getPlatform あなたを始めるための例として:

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

このようにして、OS情報はキャッシュされ、

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

DataServiceの寿命中にプラットフォーム情報を1回だけ取得します。同じアイデアを適用できます getServerData また、サーバーからデータをキャッシュすることもできます。

他のヒント

Singletonのサービスでデータをキャッシュすることは良いアプローチであり、私はあなたの簡単な実装が好きです。私の唯一の推奨事項は、3つの懸念を別々のサービスに分割することです。

  1. ブラウザ検出
  2. サーバーリクエスト(より多くのリクエストがあれば、さらに分割されます。)
  3. データキャッシング
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top