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.

  1. 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.

  1. dojo.require("dojo.hash");  
  2. dojo.require("dojox.data.FlickrRestStore");  
  3. 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.

  1. dojo.mixin(bpjs, {  
  2.     run: function() {  
  3.         // ...  
  4.     }  
  5. });  

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.

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

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.

  1. flickrStore.fetch({  
  2.     query: {  
  3.         tags: tags,  
  4.         apikey: "1fb3caaf3c852f2dab4c83f0a33dc48e"  
  5.     },  
  6.     count: 10,  
  7.     onComplete: function(items) {  
  8.         // ...  
  9.     }  
  10. });  

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.

  1. onComplete: function(items) {  
  2.     var set = tags + "-set";  
  3.     dojo.forEach(items, function(item) {  
  4.         lightbox.addImage({  
  5.             title: flickrStore.getValue(item, "title"),  
  6.             href: flickrStore.getValue(item, "imageUrl")  
  7.         }, set);  
  8.     });  
  9.     lightbox.show({ group: set });  
  10.     lightbox._nextImage();  
  11. }  

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.

  1. <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.

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

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

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

  1. <body class="tundra">  

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

  1. dojo.provide("bpjs");  
  2.   
  3. dojo.require("dojo.hash");  
  4. dojo.require("dojox.data.FlickrRestStore");  
  5. dojo.require("dojox.image.Lightbox");  
  6.   
  7. dojo.mixin(bpjs, {  
  8.   
  9.     run: function() {  
  10.         var flickrStore = new dojox.data.FlickrRestStore(),  
  11.             lightbox = new dojox.image.LightboxDialog(),  
  12.             tags = dojo.hash() || "javascript";  
  13.         lightbox.startup();  
  14.         flickrStore.fetch({  
  15.             query: {  
  16.                 tags: tags,  
  17.                 apikey: "1fb3caaf3c852f2dab4c83f0a33dc48e"  
  18.             },  
  19.             count: 10,  
  20.             onComplete: function(items) {  
  21.                 var set = tags + "-set";  
  22.                 dojo.forEach(items, function(item) {  
  23.                     lightbox.addImage({  
  24.                         title: flickrStore.getValue(item, "title"),  
  25.                         href: flickrStore.getValue(item, "imageUrl")  
  26.                     }, set);  
  27.                 });  
  28.                 lightbox.show({ group: set });  
  29.                 lightbox._nextImage();  
  30.             }  
  31.         });  
  32.         dojo.subscribe("/dojo/hashchange"this'run');  
  33.     }  
  34.   
  35. });  

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.