Verbetering van webapps met AmplifyJS

Er lijkt elke week een nieuwe oogst aan JavaScript-bibliotheken met speciale doeleinden te bestaan. Het lijkt erop dat de dagen zijn dat er maar één bibliotheek per project wordt gebruikt. Vandaag zal ik je voorstellen aan een zeer coole componentbibliotheek, AmplifyJS, die slechts enkele zeer gespecialiseerde componenten biedt.


Devs, Maak kennis met AmplifyJS

Volgens de website:

AmplifyJS is een set componenten die is ontworpen om veelvoorkomende webapplicatieproblemen op te lossen.

Klinkt prestigieus, maar wat zit er in deze bibliotheek??

AmplifyJS heeft drie belangrijke stukken:

  • Een AJAX API
  • Een PubSub-gebeurtenissysteem
  • Een opslag-API aan de clientzijde

Ga nu met me mee voor een rondleiding door de ongelooflijke AmplifyJS-bibliotheek! We gaan een supereenvoudige medewerkers-tracker bouwen; eigenlijk is het gewoon een tabel met een paar app-achtige functies, met (gedeeltelijk) dank aan AmplifyJS.

We hoeven ons vandaag niet echt bezig te houden met styling- en layout-problemen dus ik ga de Twitter Bootstrap-bibliotheek gebruiken. Het is ongelooflijk eenvoudig: neem gewoon de link naar het CSS-bestand - waarmee ze u vanuit Github hotlinken - en u bent in zaken.


Stap 1: Instellen

Maak dus een projectmap. Begin met de index.html bestand en a js map. Ga nu naar de AmplifyJS-website en klik op die grote, rode download? knop. Eenmaal heb je de bibliotheek zip, pak het uit en verplaats het naar de js map. We zullen nog een paar andere dingen nodig hebben:

  • jQuery: De AJAX-component van Amplify maakt gebruik van de AJAX-functie van jQuery onder zijn API, ten minste standaard. Maar we zullen jQuery gebruiken voor andere dingen, dus breng het in.
  • bootstrappen-modal.js: De Twitter Bootstrap-bibliotheek bevat een paar scripts om alle interacties te krijgen. En we gaan er een gebruiken: de jQuery-plug-in voor het modale venster. Download het en voeg het toe js map.
  • Er zijn nog twee andere scripts die ik onderweg zal noemen, maar deze zullen we zelf schrijven.

Start dan onze index.html bestand als dit:

   AmplifyJS    

commando's

werknemers

Als je niet bekend bent met het gebruik van Twitter Bootstrap, zul je zien dat het geen zweet is om te gebruiken. We hebben een houder dat is 940px breed. Dan hebben we er twee rijs. De eerste heeft één kolom die alle 16 kolommen omvat. De andere heeft twee kolommen: één is 4 kolommen breed en één is 12 kolommen breed.

Nog een ding, voordat we een echte codering krijgen: we zullen een modaal venster openen dat inputmedewerkers toestaat. Onder de

, voeg dit modale venster HTML toe. Ja, het lijkt veel code, maar het zijn vooral Bootstrap-dingen:

X

Voeg een werknemer toe

Oké, we zijn klaar om te gaan! Laten we coderen.


Stap 2: Bedrading van het Modal-venster

Open een script label onderaan index.html (Ik doe dit alleen inline, maar voel me om het in een nieuw JS-bestand te plaatsen). begin op deze manier:

 (function () var employeeModal = $ ('# add-employee-modal'). modal (backdrop: 'static'); ());

We gebruiken de Bootstrap modale plug-in hier; dit maakt gewoon een indruk? het modale venster. Nu willen we dat het venster wordt weergegeven wanneer we op? Toevoegen werknemer klikken? knop. Natuurlijk moeten we eerst de knop toevoegen: plaats dit in de

, recht onder de

.

 

Dat data-controles-modale = 'add-medewerker-modale' attribuut toont het modaal met die ID wanneer op de knop wordt geklikt.

Dus, de gebruiker moet het formulier invullen, klik dan op? Toevoegen? knop met een id van create-werknemer. Laten we een klikgebeurtenishandler voor de knop indraaien:

$ ('# create-employee'). click (function () var form = $ ('# employee-form'); employeeModal.modal ('hide'); EMPLOYEE.create (form.find ('[name = voornaam]]) val (), form.find ('[naam = achternaam]'). val (), form.find ('[naam = rol]'). val ()); form.find ('input ') .val ("););

We krijgen het formulier en verbergen vervolgens het modale venster. Dan gaan we bellen EMPLOYEE.create methode, waarbij de voornaam, achternaam en rol als de drie parameters worden doorgegeven. Ten slotte wissen we het formulier.

amplify.publish

Maar wacht, u zegt wat er is EMPLOYEE.create? Wel, het is een micro-? Klas? die ik heb ingebracht js / employee.js. Bekijken:

var EMPLOYEE = create: function (firstName, lastName, role) var employee = firstName: firstName, lastName: lastName, role: role, dateEmployed: new Date (); amplify.publish ('employee-created', medewerker); terugkeer medewerker; ;

Je wilt er een scripttag voor gebruiken samen met de anderen.

Best simpel, toch? We maken gewoon een letterlijk object met onze parameters en voegen er een toe Datum in dienst eigendom. Maar dan - en tot slot! - hebben we de eerste toegang tot het AmplifyJS-raamwerk. Hier gebruiken we de component pub / sub-evenementen. Dit is geweldig om losse koppelingen tussen delen van uw app te maken.

Deze methode hoeft niet te weten of een ander deel van onze code iets wil doen met elke nieuwe werknemer die we creëren; Onze? Toevoegen? button event handler hoeft zich daar geen zorgen over te maken. We publiceren het gewoon als een? Employee-created? evenement voor elk onderdeel dat geïnteresseerd is om te nemen. We geven ons nieuwe werknemersobject door als gegevens voor iedereen die geïnteresseerd is. Vervolgens retourneren we het werknemersobject (ook al houden we het niet bij in onze gebeurtenishandler).


Stap 3: Reageren met amplify.subscribe

Zo, is een ander deel van onze app geïnteresseerd in de? employee-created? Ja, in feite. We willen twee dingen doen. Voeg eerst deze medewerker toe aan een tabel op onze pagina. Ten tweede willen we de medewerker opslaan in localStorage. Dit is het eerste deel daarvan:

 amplify.subscribe ('employee-created', function (employee) employeeTable.add ([employee.firstName, employee.lastName, employee.role, employee.dateEmployed]); newAlert ('success', 'New Employee Added') ;);

Om te abonneren op een evenement, bellen we amplify.subscribe. We willen abonneren op de? Employee-created ?; wanneer die gebeurtenissen plaatsvinden, willen we deze toevoegen aan de employeeTable; merk op dat in plaats van alleen het doorgeven van de werknemer object, wij? converteren? het naar een array; dit komt omdat we er zeker van moeten zijn dat de elementen in de juiste volgorde staan. Vervolgens willen we een bericht weergeven, zodat onze gebruiker weet dat de medewerker succesvol is toegevoegd.

Wat is hier aan de hand employeeTable variabele? Nou, eerst moeten we het toevoegen

naar ons document. Dus, onder onze? Medewerkers?

, Voeg dit toe:

Voornaam Achternaam Rol Datum in dienst

Nu moeten we deze tabel vastleggen als een variabele in onze var verklaring bovenaan:

employeeTable = TABLE.create ($ ('# employee-table')),

En TAFEL? Dat is het laatste stukje JS voor deze puzzel. Zet dit erin js / table.js en vergeet de script-tag niet:

var TABLE = proto: init: function (el) this.element = $ (el) .find ('tbody'); , voeg toe: function (arr) var row = $ ('') .html (function () return $ .map (arr, function (value) return''+ waarde +''; ). join (");); this.element.append (row);, load: function (rijen, volgorde) for (var i = 0; rows [i]; i ++) this.add ( rijen [i]); var fields = []; for (var j = 0; order [j]; j ++) fields.push (rijen [i] [bestel [j]]); this.add (velden );, clear: function () this.element.empty ();, create: function (el) var table = Object.create (this.proto); table.init (el); retourtabel; ;

Het is een beetje ingewikkeld, maar je zou geen probleem moeten hebben om het te spelen. We hebben een proto eigenschap die het prototype is voor onze tabelinstanties. Dan, als we bellen creëren, we gebruiken Object.create om een ​​object te maken dat erft van this.proto. Daarna noemen we de in het methode om eigenschappen in te stellen. Ten slotte retourneren we de tabelinstantie.

Deze micro-API maakt het gemakkelijk voor ons om met onze tafel te werken. Je zou moeten kunnen zien hoe een array wordt doorgegeven aan de toevoegen methode voegt een rij toe aan onze tabel. Merk ook op dat we een reeks rijen kunnen doorgeven aan laden en vul de tabel op; we zullen dit binnenkort gebruiken.

Oh, dan is daar de newAlert methode die we hebben genoemd:

function newAlert (type, bericht) $ ('# alert-area'). add ($ ('

'+ bericht +'

')); setTimeout (function () $ ('. alert-message'). fadeOut ('slow', function () this.parentNode.removeChild (this););, 2000);

Zoals je kunt zien, voegt dit gewoon gewoon een div binnenstebuiten

; de nieuwe div maakt gebruik van de Twitter Bootstrap alert-styling; na twee seconden vervagen we de waarschuwing en verwijderen deze.

amplify.store

Maar dat is niet de enige die we willen doen als de? Employee-created? evenement vindt plaats:

employeeStore = amplify.store ('employees') || [];

Maak bovenaan met onze twee andere variabelen de derde en laatste variabele: employeeStore. Als amplify.store (werknemers) geeft iets terug, we zullen dat gebruiken; anders gebruiken we een lege array.

amplify.subscribe ('employee-created', functie (werknemer) employeeStore.push (medewerker); amplify.store ('employees', employeeStore););

Nu gebruiken we de opslagcomponent van AmplifyJS. Het kan echt niet eenvoudiger: om een ​​waarde op te slaan, door te geven amplify.store een sleutel en de waarde. Haal de sleutel over om de waarde op te halen. Daaronder slaat AmplifyJS die sleutel en waarde op in welk opslagtype dan ook beschikbaar is in die browser.

Dus hier voegen we een nieuwe medewerker toe aan de array en slaan we de array op in de? Medewerkers? sleutel. Ik moet er rekening mee houden dat, aangezien we een array opslaan, AmplifyJS JSON-serialisatie gebruikt om die array naar een string te converteren. Daarom, als u browsers probeert te ondersteunen zonder native JSON-ondersteuning (IE 5 en lager, Firefox 3 en lager), wilt u de json2.js-bibliotheek opnemen.


Stap 4: Opslaan naar de server (met amplify.request)

In ons kleine app-voorbeeld zeggen we dat de gegevens die u in de app zet, standaard alleen op uw computer worden bewaard (in die ene browser). Als de gebruiker dat wil, kunnen we ze echter op de server zetten (dit is waarschijnlijk privéinformatie die ze misschien niet willen delen, maar als ze deze vanaf andere apparaten willen openen, kunnen ze dit doen. ).

We beginnen met het toevoegen van een knop voor het uploaden van de gegevens.

Nu, natuurlijk, hebben uw briljante geesten er al achter dat we de AJAX-component van AmplifyJS zullen gebruiken. amplify.request is een ongelooflijk flexibele API, en we zullen niet alles bekijken wat het kan doen. U krijgt echter een goed idee van hoe het hier werkt.

AJAX doen met AmplifyJS is een beetje anders dan bij andere bibliotheken: het idee is dat u eerst een verbinding met de server definieert; dan kunt u die verbinding een aantal keer daarna gebruiken. Laten we beginnen met het definiëren van een verbinding, een? Resource? door AmplifyJS:

amplify.request.define ('pushData', 'ajax', url: 'data.php', type: 'POST');

De eerste parameter hier is RESOURCEID, die we instellen als? pushData ?; dit is hoe we naar onze verbinding verwijzen als we deze gebruiken. De tweede parameter is het verzoektype; in dit geval,? ajax.? Dit is het enige verzoektype dat is ingebouwd in AmplifyJS; u kunt uw eigen toevoegen, maar dit is geschikt voor onze behoeften van vandaag.

Ten slotte hebben we een optievoorwerp. Volgens de documentatie zijn je instellingenopties alles wat je zou instellen jQuery.ajax, net zoals cache (waarmee u een aangepaste geheugencache kunt instellen) en decoder (voor het parseren van het AJAX-antwoord). In ons geval zijn slechts twee opties nodig: de url, en de type van het verzoek dat we doen.

Natuurlijk hebben we wat eenvoudige PHP aan de achterkant nodig; zorg ervoor dat de gegevens map is schrijfbaar.

data.php

 

Hoe zit het met het gebruik van de verbinding, de bron, die we hebben gedefinieerd? Laten we dit in een click-handler doen