سؤال

أنا لست مؤيدا في الزاوية وما زلت ليرنينج. آمل أن أحصل على بعض المساعدة هنا.

أريد إنشاء تطبيق مع طرق عرض مختلفة. أحتاج إلى اكتشاف المتصفح وأيضًا جلب بعض البيانات من الخادم. لهذا قمت بإنشاء خدمة ، حيث أقوم بهذا العمل.

رغبتي هي استخدام بيانات الخدمة في جميع المشاهدات. كيف هي الطريقة الصحيحة لتخزين البيانات وتخزينها حتى أتمكن من استخدامها في جميع طرق العرض/وحدات التحكم الخاصة بي؟
هذا ما حصلت عليه حتى الآن.

خدمتي:

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

وبهذه الطريقة ، يتم تخزين المعلومات مؤقتًا ، و

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

سوف يجلب فقط معلومات النظام الأساسي مرة واحدة خلال فترة حياة خدمة البيانات. يمكنك تطبيق نفس الفكرة على getServerData وكذلك لتخزين البيانات من الخادم.

نصائح أخرى

يعد التخزين المؤقت لبياناتك في خدمة Singleton طريقة جيدة ، وأنا أحب تطبيقك المباشر. توصيتي الوحيدة هي تقسيم مخاوفك الثلاثة إلى خدمات منفصلة.

  1. اكتشاف المتصفح
  2. طلبات الخادم (والتي سيتم تقسيمها أكثر بمجرد تلقي المزيد من الطلبات.)
  3. التخزين المؤقت للبيانات
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top