ugrás a tartalomhoz

dojo.bootstrap()

Török Gábor · 2010. Szep. 24. (P), 13.17
dojo.bootstrap()

A Dojo Toolkit (továbbiakban: Dojo) elsődlegesen böngésző alapú fejlesztést támogató JavaScript eszközkészlet. Az alábbi írás nem kíván és nem nyújt átfogó képet az eszközkészletről, ehelyett egy Dojora támaszkodó példa alkalmazás fejlesztésén keresztül bemutatja a toolkit képességeinek, szolgáltatásainak egy szeletét. A kitűzőtt feladat az alábbi: jelenítsünk meg tíz, URL hashként megadott kulcsszóra illeszkedő fotót a Flickrről Lightbox jellegű albumba szervezve.

dojo.provide("bpjs");

A dolgozat alapját a májusi JavaScript meetupon elhangzott előadás képezi. Az előadás videófelvétele, fóliái, valamint a bemutatott példa alkalmazás megtekinthetők.

A Dojo aktívan épít a moduláris kódszervezésre. Nem követeli meg a móduláris kódszervezést, de ahhoz minden eszközt megad. Modul rendszere ihlette a RequireJS-t, de filozófiája fellelhető a Google Closure és a YUI3 keretrendszerek megvalósításban is. A modulok több funkciót látnak el: névtér kezelés, függőség feloldás, függvénytár behívása futásközben, gyorstárazás.

A Dojo összesen négy globális névteret foglal le: dojo (a keretrendszer magja), dijit (widgetek), dojox (egyfajta contrib gyűjtemény) és doh (egységteszt keretrendszer). A dojo.provide()-dal definiálható új modul. Jelen esetben az alkalmazás számára létrehozzuk a bpjs modult. Ezzel többek között a globális objektumhoz (böngészőben praktikusan window) kötöttünk egy bpjs változót. Ez alatt építkezünk.

dojo.require("dojo.hash");
dojo.require("dojox.data.FlickrRestStore");
dojo.require("dojox.image.Lightbox");

A dojo.require() függvénnyel jelezhetők az adott modul (most bpjs) függőségei. A Dojo a modulokat nyilvántartja, szükség szerint gyorstárazza. A függőségek feloldását a nyilvántartás alapján végzi el, egy modult egyszer tölt be.

A Dojo a JQuery-vel ellentétben nem bővíthető a klasszikus értelemben vett pluginokkal. A Dojo keretrendszert ad komponensek fejlesztéséhez. Központi tárolót nem tart fent a nem hivatalos Dojo komponenseknek. A dojox névtér alá kerülnek azon megbízható komponensek, amelyek még nem teljesítik az összes Dojo komponenssel szemben támasztott elvárást. (Valamennyi Dojo widget kötelezően kielégíti az akadálymentességi irányelveket és lokalizált.)

A dojo.hash modul tartalmazza a location hash kezeléshez szükséges funkcionalitást. A dojox.data.FlickrRestStore a dojo.data.api-t kiterjesztő alrendszer. A Lightbox egy képgaléria widget.

dojo.mixin(bpjs, {
    run: function() {
        // ...
    }
});

A Dojo objektum-orientált szemléletű. Keretrendszert nyújt JavaScript alapú objektum-orientált fejlesztéshez. Támogatja a többszörös öröklődést. Az objektumok a pseudo-klasszikus iskola szerint és mixinekkel kiterjeszthetők. A példa alkalmazásban definiálunk egy run() metódust a bpjs objektumon belül, amely az alkalmazás elindításért lesz felelős.

run: function() {
    var flickrStore = new dojox.data.FlickrRestStore(),
        lightbox = new dojox.image.LightboxDialog(),
        tags = dojo.hash() || "javascript";
    lightbox.startup();
    flickrStore.fetch(/* ... */);
    dojo.subscribe("/dojo/hashchange", this, 'run');
}

Inicializáljuk a lightbox widgetet, lekérjük a képeket a Flickrről, és hash változás esetén újraindtjuk az alkalmazást. A standard DOM-közeli eseménykezelőkön túl egy komplett feliratkozás-hirdetés (pub-sub) alapú eseménykezelő alrendszert valósít meg a Dojo. Tetszőleges saját események válthatók ki és figyelhetők.

flickrStore.fetch({
    query: {
        tags: tags,
        apikey: "1fb3caaf3c852f2dab4c83f0a33dc48e"
    },
    count: 10,
    onComplete: function(items) {
        // ...
    }
});

Az erősen változó paraméterlistájú függvényekhez a Dojo az új hullámos objektum literál jelölésen alapuló mintát használja. Ez egyfelől kényelmes, másrészt future-proof API-ként szolgál.

Lekérdezzük a Flickr store-t a megadott kulcsszóra. Legfeljebb 10 találatot kérünk vissza.

onComplete: function(items) {
    var set = tags + "-set";
    dojo.forEach(items, function(item) {
        lightbox.addImage({
            title: flickrStore.getValue(item, "title"),
            href: flickrStore.getValue(item, "imageUrl")
        }, set);
    });
    lightbox.show({ group: set });
    lightbox._nextImage();
}

A dojo.forEach az 1.5-ös JavaScript szerinti forEach-et valóstja meg. Számos, a böngészőgyártók által még nem implementált JavaScript jellemző elérhető a Dojon keresztül. Az API-juk és viselkedésük megegyezik a szabvánnyal definiálttal, azzal a kitétellel, hogy míg a szabványos függvény az elem saját metódusa, addig a dojos a dojo névtér alatt érhető el, és első argumentumként mindig az elemet várja. A Dojo jellemzően nem terjeszti ki az alap javascriptes objektumokat.

Az eredményhalmaz szerint feltöltjük a Lightbox albumot, majd az első képnél kinyitjuk.

<script src="http://o.aolcdn.com/dojo/1.4/dojo/dojo.xd.js"></script>

A Dojo bevetéséhez egyszerűen töltsük be valamelyik CDN-ről az alap keretrendszert. Cross-domain (XDomain) módban minden az alap keretrendszében (Base, Core) nem szereplő komponens a háttérben aszinkron kerül letöltése. Lehetőség van helyi kópia használatára is. Ebben az esetben a Dojo Toolkittel érkező build rendszerrel saját magunk készíthetünk JavaScript csomagokat annak minden előnyével.

<script src="bpjs.js"></script>

Töltsük be a kódtárunkat. A fájl neve a modul nevével megegyező.

<script>
dojo.ready(function() {
    bpjs.run();
});
</script>
Ha már minden készen áll, indítsuk el az alkalmazásunkat.
<style type="text/css">
  @import "http://o.aolcdn.com/dojo/1.4/dojo/themes/tundra/dojo.css";
  @import "http://o.aolcdn.com/dojo/1.4/dijit/themes/tundra/tundra.css";
  @import "http://o.aolcdn.com/dojo/1.4/dojox/image/resources/Lightbox.css";
</style>

A Dojoval érkezik egy stíluslap, amely az elemek megjelenését konszolidálja. Az általános deklarációkon túl négy beépített sminket támogat a Dojo: tundra, nihil, claro, soria. Minden widget szállíthat saját stíluslapot.

<body class="tundra">

A body osztályaként jelölhetjük meg a használandó sminket.

dojo.provide("bpjs");

dojo.require("dojo.hash");
dojo.require("dojox.data.FlickrRestStore");
dojo.require("dojox.image.Lightbox");

dojo.mixin(bpjs, {

    run: function() {
        var flickrStore = new dojox.data.FlickrRestStore(),
            lightbox = new dojox.image.LightboxDialog(),
            tags = dojo.hash() || "javascript";
        lightbox.startup();
        flickrStore.fetch({
            query: {
                tags: tags,
                apikey: "1fb3caaf3c852f2dab4c83f0a33dc48e"
            },
            count: 10,
            onComplete: function(items) {
                var set = tags + "-set";
                dojo.forEach(items, function(item) {
                    lightbox.addImage({
                        title: flickrStore.getValue(item, "title"),
                        href: flickrStore.getValue(item, "imageUrl")
                    }, set);
                });
                lightbox.show({ group: set });
                lightbox._nextImage();
            }
        });
        dojo.subscribe("/dojo/hashchange", this, 'run');
    }

});

Mint a felvezetőben említett, a bemutatott alkalmazás közel sem aknázza ki a Dojo nyújtotta eszköz palettát, Mindenazonáltal jó kiindulási pontként szolgálhat mindazok számára, akik megismerkednének a Dojo Toolkittel.