Localstorage не работи в геолокация на openlayers

ТУК е малка демонстрация, която аз изтеглен от страницата с примери на openlayers3, можете да видите част от примерен код по-долу:

var map = new ol.Map({
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    target: 'map',
    controls: ol.control.defaults({
        attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
            collapsible: false
        })
    }),
    view: view
});

Сега исках да използвам localStorage и затова промених кода, за да бъде както следва:

if(!localStorage.layer) {
    localStorage.layer = new ol.layer.Tile({ source: new ol.source.OSM()  })
}

// creating the map
var map = new ol.Map({
    layers: localStorage.layer ? [ localStorage.layer ] : [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    target: 'map',
    controls: ol.control.defaults({
        attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
            collapsible: false
        })
    }),
    view: view
});

Сега това по някаква причина не работи, сега, ако направя някакво отстраняване на грешки, получавам следното

Сега, ако напиша следното в конзолата:

new ol.layer.Tile({ source: new ol.source.OSM() })

взимам

G {ca: false, ka: undefined, fb: Kc, pd: G, Ma: null…}

Но ако го направя

localStorage.layer = new ol.layer.Tile({ source: new ol.source.OSM()  })

И след това въведете:

localStorage.layer

взимам

"[object Object]"

Така че защо localStorage.layer не е равно на ново ol.layer.Tile({ source: new ol.source.OSM() })? Вярвам, че това е причината картата да не се зарежда. Разбира се, ако премахна кода на localStorage, картата за геолокация работи добре. Така че защо localStorage.layer не е равно на ново ol.layer.Tile({ source: new ol.source.OSM() })?


person Tenali Raman    schedule 26.10.2015    source източник
comment
Може да искате да анализирате localStorage.layer, като направите нещо като JSON.parse(localStorage.layer). Това ще ви даде обекта. Но не съм оптимист за сравнението, тъй като няма два идентични обекта.   -  person Hunan Rostomyan    schedule 26.10.2015
comment
@HunanRostomyan naa не работи!   -  person Tenali Raman    schedule 26.10.2015


Отговори (2)


Tile връща някакъв вид обект, докато стойността на localStorage.getItem(layerStr) е низ. За да извлечете съхранения обект от низа, можете да направите JSON.parse(localStorage.getItem(layerStr)), където layerStr = JSON.stringify(layer). Ето един много измислен пример за съхраняване и извличане на обект от localStorage:

var person = {first: 'Tenali', last: 'Raman'};

localStorage.setItem('person', JSON.stringify(person));

JSON.parse(localStorage.getItem('person'));  // => {first: 'Tenali', ...}

Но дори и тогава, за съжаление, не можете да получите отговора, който искате, както показва това:

var storedTile = JSON.parse(localStorage.getItem(layer));
var storedTile2 = JSON.parse(localStorage.getItem(layer));

storedTile == storedTile2;  // => false
storedTile === storedTile2;  // => false; follows from the line above

Като цяло обектите се сравняват по идентичност, а не по стойност. Вижте този отговор за връзката на равенство между два обекта на JavaScript за подробностите.

person Hunan Rostomyan    schedule 26.10.2015
comment
@TenaliRaman Това е така, защото localStorage има различен API за получаване/задаване на променливи. Въпреки че кодът по-горе е само за демонстрация, ще го модифицирам, за да отразява API за съхранение. - person Hunan Rostomyan; 26.10.2015
comment
@TenaliRaman Разширих отговора си с илюстрация за това как можете да съхранявате прости обекти в хранилището и след това да ги извличате. - person Hunan Rostomyan; 26.10.2015

Обектът localStorage може да съхранява само низ, вижте документ .

Когато правите localStorage.layer = new ol.layer.Tile({ source: new ol.source.OSM() }) всъщност съхранявате (new ol.layer.Tile({ source: new ol.source.OSM() })).toString() така че localStorage.layer = "[object Object]" и очевидно не може да бъде равно на вашия обект на слой.

Просто не можете да съхранявате обект в локално хранилище, а само низ.

person oterral    schedule 26.10.2015