VOS - Data ophalen uit lokale JSON bestanden
Home

VOS - Data ophalen uit lokale JSON bestanden

VOS - Data ophalen uit lokale JSON bestanden

We stoppen de gegevens van de database niet in de app zelf. We willen niet dat als de app van de store wordt gedownload dat de databasegegevens mee gedownloaded worden. De gebruiker van de app moet zich om veiligheidsredenen eerst aanmelden op de server en dan pas worden de databasegegevens, in overeenstemming met zijn/haar rol, gedownloaded.

Vermits we 'agile' werken gaan we in een eerste fase de database gegevens inlezen vanuit lokale json databestanden. In een latere fase gaan we die met behulp van een API ophalen uit de database op de server.

Databasemodel

De beschrijving van het databasemodel vind je op VOS - ERD.

Database gegevens inlezen

De code staat in het bestand met de naam js/vos.js.

Om een lokaal bestand in te lezen kunnen we de Ajax klasse gebruiken. Hoe je dat doet vind je op JSON - data ophalen uit lokale JSON bestanden. Dezelfde klasse die we later zullen gebruiken om de API op de server aan te spreken. Als de bestanden zijn ingelezen slaan we de JSON op in localStorage.

We slaan de hele JSON string op in één localStorage item als string. Om de data gemakkelijk in JavaScript te kunnen manipuleren halen we de JSON string uit de localStorage en zetten die om naar een JavaScript object.

We declareren globale variabelen waarin we de gegevens opslaan om tijdens de uitvoering van de app te gebruiken in het bestand met de naam js/vos.js:

// globals
var identity;
var procedureList;
var institutionList;
var position;
var myLocation;

We roepen we de loadData methode op wanneer de index.html (op Cloud9 is dat index003.html) pagina in de browser geladen is:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="css/vos.css">
    <link type="text/css" rel="stylesheet" href="css/iconfont.css">
    <title>Veilig op school</title>
    <script type="text/javascript" src="js/modern-ajax.js"></script>
    <script type="text/javascript" src="js/vos.js"></script>
    <script>
        window.onload = function() {
            loadData();
        }
        window.location.href = '#app-index';
    </script>
</head>
<body>
</body>
</html>

De clearLocalStorage methode is een helper functie waarmee de local storage leeg maken als we tijdens het ontwikkelen van de app de JSON bestanden hebben gewijzigd. Doen we dat niet dan blijft de vorige versie van het JSON bestand in het geheugen zitten omdat we de local storage slechts instellen als dat nog niet eerder gebeurd is.

/* tijdens het ontwikkelen van de app kan het nodig
 * zijn de localStorage leeg te maken
*/
var clearLocalStorage = function () {
    localStorage.removeItem('identity');
    localStorage.removeItem('procedureList');
    localStorage.removeItem('position');
    localStorage.removeItem('organisationList');
}

We nesten de $http call's in de juiste volgorde:

  1. indentity.json
  2. procedureList.json
  3. position.json
  4. organisationList.json
$http('data/identity.json')
    .get()
    .then(function(data) {
        callback.identityLoaded(data);
        var payload = {};
        return $http('data/procedureList.json').get(payload);
    })
   .then(function(data) {
        callback.procedureListLoaded(data);
        var payload = {};
        return $http('data/position.json').get(payload);
    })
    .then(function(data) {
        callback.positionLoaded(data);
        var payload = {};
        return $http('data/organisationList.json').get(payload);
    })
    .then(function(data) {
        callback.organisationListLoaded(data);
    })
    .catch(callback.err

In de callback methode voor elke $http call:

  1. als de JSON string nog niet is opgeslagen in local storage, doen we dat;
  2. initialiseren we de overeenkomstige globale variabele;
var loadData = function() {
var callback = {
    identityLoaded: function(data) {
        if (!localStorage.getItem('identity')) {
            localStorage.setItem('identity', data);
        }
        identity = JSON.parse(localStorage.getItem('identity'));
    },
    procedureListLoaded: function(data) {
        if (!localStorage.getItem('procedureList')) {
            localStorage.setItem('procedureList', data);
        }
        procedureList = JSON.parse(localStorage.getItem('procedureList'));
    },
    positionLoaded: function(data) {
        if (!localStorage.getItem('position')) {
            localStorage.setItem('position', data);
        }
        position = JSON.parse(localStorage.getItem('position'));
    },
    organisationListLoaded: function(data) {
        if (!localStorage.getItem('organisationList')) {
            localStorage.setItem('organisationList', data);
        }
        organisationList = JSON.parse(localStorage.getItem('organisationList'));
    },
    error: function(data) {
        var p = document.createElement('P');
        p.innerHTML = '2 error: ' + data;
        p.style.color = '#ff0000';
        document.body.appendChild(p);
    }
};

De volledige loadData functie in het js/vos.js bestand:

// globals
var identity;
var procedureList;
var organisationList;
var position;
var myLocation;

/* tijdens het ontwikkelen van de app kan het nodig
 * zijn de localStorage leeg te maken
*/
var clearLocalStorage = function () {
    localStorage.removeItem('identity');
    localStorage.removeItem('procedureList');
    localStorage.removeItem('position');
    localStorage.removeItem('organisationList');
}

var loadData = function() {
    var callback = {
        identityLoaded: function(data) {
            if (!localStorage.getItem('identity')) {
                localStorage.setItem('identity', data);
            }
            identity = JSON.parse(localStorage.getItem('identity'));
        },
        procedureListLoaded: function(data) {
            if (!localStorage.getItem('procedureList')) {
                localStorage.setItem('procedureList', data);
            }
            procedureList = JSON.parse(localStorage.getItem('procedureList'));
        },
        positionLoaded: function(data) {
            if (!localStorage.getItem('position')) {
                localStorage.setItem('position', data);
            }
            position = JSON.parse(localStorage.getItem('position'));
        },
        organisationListLoaded: function(data) {
            if (!localStorage.getItem('organisationList')) {
                localStorage.setItem('organisationList', data);
            }
            organisationList = JSON.parse(localStorage.getItem('organisationList'));
        },
        error: function(data) {
            var p = document.createElement('P');
            p.innerHTML = '2 error: ' + data;
            p.style.color = '#ff0000';
            document.body.appendChild(p);
        }
    };

    $http('data/identity.json')
        .get()
        .then(function(data) {
            callback.identityLoaded(data);
            var payload = {};
            return $http('data/procedureList.json').get(payload);
        })
       .then(function(data) {
            callback.procedureListLoaded(data);
            var payload = {};
            return $http('data/position.json').get(payload);
        })
        .then(function(data) {
            callback.positionLoaded(data);
            var payload = {};
            return $http('data/organisationList.json').get(payload);
        })
        .then(function(data) {
            callback.organisationListLoaded(data);
        })
        .catch(callback.error);
}

Run de index.html pagina, in mijn Cloud9 workspace is dat vos/index003.html).

In de Chrome debugger kan je nagaan dat de globale correct geïnitialiseerd zijn door een breakpoint te zetten in de laatste callback methode:

VOS - globale variabelen geinitialiseerd
VOS - globale variabelen geinitialiseerd

JI
2016-12-20 15:19:47