Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   localstorage service script (https://javascript.ru/forum/misc/67063-localstorage-service-script.html)

ExXxTaSy 26.01.2017 09:03

localstorage service script
 
помогите добить скрипт. примерно понимаю что нужно сделать, но не до конца могу понять как реализовать.
пытаюсь решить проблемы с локальным хранилещем в сафари(при включенном privat mode)

мне нужно написать сервис который будет проверять работает ли локальное хранилище и если не работает то хранить данные в обьекте.
проверку примерно вроде как сделал.
а вот как хранить данные в обьекте и как сделать данный сервис публичным что бы по всему проекту его могли использовать не пойму.
по идее должен быть публичный метод какой то.
больше всего не понимаю как хранить данные потому что они по всему проекту разные.
набросал 2 вараинта. какой то из них хоть немного приближен к реальности?))
///v1
var localStorage = angular.module('moduleName', []);
moduleName.factory('localStorageService', function() {
    var storageSupportedService;
    //isStorage?
    var hasLocalStorageSupport = 'localStorage' in $window && $window.localStorage !== null;
    if (hasLocalStorageSupport) {
        var testKey = 'key';
        try {
            $window.localStorage.setItem(testKey, '1');
            $window.localStorage.removeStorage(testKey);
        } catch  (e) {
            // $scope.result = object;
            // return $scope.result;
            // localStorage.setItem( "obj", JSON.stringify( obj ) );
            hasLocalStorageSupport = false;
        }
    }
    return storageSupportedService;
});

///v2
var localStorage = angular.module('moduleName', []);
moduleName.factory('localStorageService', function() {
    var storageSupportedService;
    //isStorage?
    function isLocalStorageSupported() {
        var testKey = 'key', storage = window.localStorage;
        try {
            storage.setItem(testKey, '1');
            storage.removeItem(testKey);
            return localStorageName in window && window[localStorageName];
        } catch (error) {
            // return $scope.result;
            // localStorage.setItem( "obj", JSON.stringify( obj ) );
            return false;
        }
    }
    return storageSupportedService;
});

destus 26.01.2017 09:41

ExXxTaSy,
Цитата:

набросал 2 вараинта. какой то из них хоть немного приближен к реальности?))
https://github.com/gsklee/ngStorage/...Storage.js#L21
Цитата:

а вот как хранить данные в обьекте и как сделать данный сервис публичным что бы по всему проекту его могли использовать не пойму.
Ну так это обычный service, который собственно создается 1 раз и инжектится в нужные места.
app.service('foo', function() {
  this.bar = 'baz'
});

ExXxTaSy 26.01.2017 09:54

Цитата:

Сообщение от destus (Сообщение 442339)

пример этот видел. он прям весь необходим? как то много там всего и кажется лишнего. или там как раз "полный спектр необходимого мне" ?
я думал что вариант решения попроще. что то из моего дописать никак?
а то мне не совсем понятно что в том примере происходит. не все моменты.

ExXxTaSy 26.01.2017 09:55

Цитата:

Сообщение от Rise (Сообщение 442341)
ExXxTaSy, приватный режим есть не только в сафари.

но только они ставят размер хранилища 0 в данном режиме по умолчанию.
ну а вообще то да уже это делать для всех браузеров.

ExXxTaSy 26.01.2017 09:56

Цитата:

Сообщение от destus (Сообщение 442339)
ExXxTaSy,

Ну так это обычный service, который собственно создается 1 раз и инжектится в нужные места.
app.service('foo', function() {
  this.bar = 'baz'
});

как он инжектится? сори за тупые вопросы. только начал изучать. инфы в голове масса и каша. не все понятно как использовать.

destus 26.01.2017 10:12

Цитата:

пример этот видел. он прям весь необходим? как то много там всего и кажется лишнего. или там как раз "полный спектр необходимого мне" ?
ну там 30 строчек кода, со всеми отступами и т.д., у тебя -- 20. Что именно испугало?
Цитата:

что то из моего дописать никак?
6 строка нельзя так писать без try/catch
$window.localStorage ...

Цитата:

как он инжектится?
angular
	.module('moduleName', [])
	.service('foo', function() {
		this.bar = 'baz'
	})
	.controller('FooCtrl', ['foo', function(foo){
		alert(foo.bar);
	}])

ExXxTaSy 26.01.2017 11:08

Цитата:

Сообщение от Rise (Сообщение 442350)
Комментарии можно не использовать.

про комменты я знаю)
то есть если я возьму этот кусок
.module('moduleName', [])

	    .service('foo', function() {
                this.bar = 'baz'
	    })
	    .controller('FooCtrl', ['foo', function(foo){
	        alert(foo.bar);
	    }])


в него вставлю то что вы по ссылке дали, то все будет ок?)
теперь вопрос что куда ставить) сорри. я просто немного изменил квалификацию, и на жутких нервах, постоянно в панике. нужно както бы успокоиться)

и в примере не 20 строк а около 200 без коментов

ExXxTaSy 26.01.2017 11:36

такс. начинаю врубатся.
мне нужно подрубить это файл что вы бросили в ссылке.

а далее что то типа

ngular.module('app', [
        'ngStorage'
      ]).
      
      controller('Ctrl', function(
        $scope,
        $localStorage
      ){
        $scope.$storage = $localStorage.$default({
           ...
        });
      });


вот тут то и должно как то происходить типа работа с выбором хранилища?

ExXxTaSy 26.01.2017 11:45

так. если я верно понял.
нужно подключить тот скрипт что вы бросили.
далее как то его использовать по принципу
angular.module('app', [
        'ngStorage'
      ]).
      
      controller('Ctrl', function(
        $scope,
        $localStorage
      ){
        $scope.$storage = $localStorage.$default({
          x: 42
        });
      });


только не пойму как

ExXxTaSy 26.01.2017 11:46

я еще больше запутался

ExXxTaSy 26.01.2017 11:58

и не пойму ту библиотеку что вы бросили. где она хранит данные в обьекте? там проде бы 2 хранилища. sessionStorage, localStorage
мне это не подходит. в сафари в примат моде оба хранилища не работают. нужно именно в обьекте сервиса все хранить

ExXxTaSy 26.01.2017 14:01

var localStorage = angular.module('localStorage', []);

localStorage.factory('localStorageService', function() {
    var storageSupportedService;

    function isLocalStorageSupported() {
        var testKey = 'key', storage = window.localStorage;
        try {
            storage.setItem(testKey, '1');
            storage.removeItem(testKey);
            return localStorageName in window && window[localStorageName];
        } catch (e) {
            // return false;
            if (e == QUOTA_EXCEEDED_ERR) {
                //do obj storage

            }
        }
    }

    return storageSupportedService;
});

this.storageData = function () {

    module.exports = {
        name: 'memoryStorage',
        read: read,
        write: write,
        each: each,
        remove: remove,
        clearAll: clearAll
    };

    var memoryStorage = {};

    function read(key) {
        return memoryStorage[key]
    }

    function write(key, data) {
        memoryStorage[key] = data
    }

    function each(callback) {
        for (var key in memoryStorage) {
            if (memoryStorage.hasOwnProperty(key)) {
                callback(memoryStorage[key], key)
            }
        }
    }

    function remove(key) {
        delete memoryStorage[key]
    }

    function clearAll(key) {
        memoryStorage = {}
    }

};


что то такое пока что получается. гляньте кто то плз

ExXxTaSy 27.01.2017 12:49

вопрос решил так:
var fakeLocalStorage = function() {
        var fakeLocalStorage = {},
            storage;
         
        // If Storage exists we modify it to write to our fakeLocalStorage object instead.
        // If Storage does not exist we create an empty object.
        if (window.Storage && window.localStorage) {
            storage = window.Storage.prototype;
        } else {
            // We don't bother implementing a fake Storage object
            window.localStorage = {};
            storage = window.localStorage;
        }

        // For older IE
        if (!window.location.origin) {
            window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
        }

        var dispatchStorageEvent = function(key, newValue) {
            var oldValue = (key == null) ? null : storage.getItem(key), // `==` to match both null and undefined
                url = location.href.substr(location.origin.length),
                storageEvent = document.createEvent('StorageEvent'); // For IE,  

            storageEvent.initStorageEvent('storage', false, false, key, oldValue, newValue, url, null);
            window.dispatchEvent(storageEvent);
        };

        storage.key = function(i) {
            var key = Object.keys(fakeLocalStorage)[i];
            return typeof key === 'string' ? key : null;
        };

        storage.getItem = function(key) {
            return typeof fakeLocalStorage[key] === 'string' ? fakeLocalStorage[key] : null;
        };

        storage.setItem = function(key, value) {
            dispatchStorageEvent(key, value);
            fakeLocalStorage[key] = String(value);
        };

        storage.removeItem = function(key) {
            dispatchStorageEvent(key, null);
            delete fakeLocalStorage[key];
        };

        storage.clear = function() {
            dispatchStorageEvent(null, null);
            fakeLocalStorage = {};
        };
    };

    //
    if (typeof window.localStorage === 'object') {
        try {
            localStorage.setItem('localStorageTest', 1);
            localStorage.removeItem('localStorageTest');
        } catch (e) {
            fakeLocalStorage();
        }
    } else {
        // Use fake localStorage for any browser that does not support it.
        fakeLocalStorage();
    }


Часовой пояс GMT +3, время: 11:49.