Maak backbone beter met uitbreidingen

Backbone wordt razend populair als een framework voor webapplicatieontwikkeling. Samen met deze populariteit komen talloze uitbreidingen en plug-ins om de kracht van het frame te verbeteren en gaten in te vullen die andere vilten nodig hadden om te vullen. Laten we een paar van de beste keuzes bekijken.


Backbone.Marionette

Ontwikkeld door Derick Bailey, deze extensie is vrij groot en is mijn persoonlijke favoriet. In plaats van het toevoegen van een of twee functies aan Backbone, besloot Derick alle grootste gaten in te vullen waarvan hij dacht dat deze bestonden. Hier is wat hij zegt in het readme-bestand van het GitHub-project.

"Backbone.Marionette is een samengestelde toepassingsbibliotheek voor Backbone.js die de constructie van grootschalige JavaScript-toepassingen wil vereenvoudigen. Het is een verzameling gemeenschappelijke ontwerp- en implementatiepatronen in de toepassingen die ik (Derick Bailey) met Backbone heb gebouwd , en bevat verschillende stukken geïnspireerd op composiet-applicatie-architecturen, zoals Microsoft's "Prism" -raamwerk. "

Laten we eens nader bekijken wat Marionette ons biedt:

  • Toepassing: Dit is een centraal object dat alles in uw toepassing kan communiceren. Het biedt een manier om de hoofdweergave (s) van uw toepassing snel en eenvoudig in te stellen, een centrale gebeurtenishub die door elke module in uw toepassing kan worden doorverbonden, zodat ze niet van elkaar afhankelijk zijn, en initialisatoren voor fijnmazige besturing van hoe uw toepassing opstart.
  • modules: Een manier om de modulecode in te voegen en de modules in het centrale toepassingsobject te hernoemen.
  • Keer bekeken: Nieuwe viewklassen die worden uitgebreid met native methoden voor het opschonen, zodat u geen geheugenlekken krijgt. Het bevat ook rendering boilerplate; voor eenvoudige weergaven geeft u eenvoudig de sjabloon en het model op, en het zal de rest verwerken.
  • Collectie / samengestelde weergaven: Dit is waar het bit van de "composite application library" in het spel komt. Met deze twee weergaven kunt u eenvoudig weergaven maken die het proces van weergave van alle weergaven in een verzameling, of zelfs een geneste hiërarchie van verzamelingen en modellen, met zeer weinig inspanning aankunnen.
  • Regio's en lay-outs: Een regio is een object dat al het werk van rendering, niet-verzenden en sluiten van weergaven voor een bepaalde plaats in de DOM aankan. Een lay-out is gewoon een normale weergave waarin ook regio's zijn ingebouwd voor het verwerken van subweergaven.
  • AppRouter: Een nieuw type router dat een controller kan gebruiken om de werkbelasting aan te kunnen, zodat de router alleen de configuratie van de routes kan bevatten.
  • Evenementen: Uitgegroeid van het Wreqr-project, maakt Marionette de evenementen van Backbone nog krachtiger voor het maken van grootschalige evenementgebaseerde applicaties.

Ik heb alleen de oppervlakte van wat Marionette kan doen gekrast. Ik raad zeker aan om naar GitHub te gaan en hun documentatie op de Wiki te lezen.

Bovendien dekt Andrew Burgess Marionette in zijn cursus Tuts + Premium Advanced Backbone Patterns and Techniques.


Backbone.Validation

Backbone.Validation is ontworpen om een ​​kleine niche van een probleem te vullen: namelijk modelvalidatie. Er zijn verschillende validatie-uitbreidingen voor Backbone, maar deze lijkt het meeste respect uit de community te hebben gekregen.

In plaats van echt een te moeten schrijven bevestigen methode voor uw modellen, kunt u een bevestiging eigenschap voor uw modellen. Dit is een object dat elk kenmerk aangeeft dat u wilt valideren en een lijst met validatieregels voor elk van die kenmerken. U kunt ook foutberichten voor elk kenmerk opgeven en aangepaste functies doorgeven voor het valideren van één attribuut. U kunt een voorbeeld hieronder zien, dat is aangepast van een van de voorbeelden op hun website.

 var SomeModel = Backbone.Model.extend (validation: name: required: true, 'address.street': required: true, 'address.zip': length: 4, age: range: [1, 80], e-mail: pattern: 'email', // voer uw eigen foutmelding in msg: "Vul alstublieft een geldig e-mailadres in", // aangepaste validatiefunctie voor 'someAttribute' someAttribute: function (value) if (value! == 'somevalue') return 'Foutmelding';);

Er zijn talloze ingebouwde validators en patronen die u kunt controleren, en er is zelfs een manier om de lijst uit te breiden met uw eigen globale validators. Deze Backbone-plug-in maakt niet echt validatieplezier, maar het elimineert zeker alle excuses voor het niet toevoegen van validatie. Bezoek hun site voor meer voorbeelden en een diepere uitleg over het gebruik van deze geweldige tool.


Backbone.LayoutManager

Backbone.LayoutManager draait helemaal om het verbeteren van Backbone's Views. Net als Backbone.Marionette, wordt er een opschooncode ingevoerd om geheugenlekken te voorkomen, wordt alle boilerplate verwerkt en blijft alleen de configuratie- en applicatiespecifieke code over. In tegenstelling tot Marionette richt LayoutManager zich specifiek op Views.

Omdat LayoutManager zich uitsluitend op Views richt, kan het meer doen voor de views dan Marionette. LayoutManager kan bijvoorbeeld asynchrone weergave uitvoeren, in het geval dat u uw sjablonen dynamisch wilt laden vanuit externe bestanden.

LayoutManager kan ook subvisies aan, hoewel op een heel andere manier dan Marionette. Hoe dan ook, het is grotendeels een configuratie, waardoor dingen extreem eenvoudig zijn en 90% van het werk dat je zou moeten doen, zou verdwijnen als je dit allemaal alleen zou proberen te implementeren. Bekijk hieronder een eenvoudig voorbeeld voor het toevoegen van drie subweergaven aan een weergave:

 Backbone.Layout.extend (views: "header": nieuwe HeaderView (), "sectie": nieuwe ContentView (), "footer": nieuwe FooterView ());

Ga zoals gebruikelijk naar de GitHub-pagina en documentatie voor meer informatie.


Backbone.ModelBinder

Backbone.ModelBinder maakt koppelingen tussen de gegevens in uw modellen en markeringen weergegeven door uw weergaven. U kunt dit al doen door zich aan de wijzigingsgebeurtenis op uw modellen te binden en de weergave opnieuw weer te geven, maar ModelBinder is efficiënter en eenvoudiger in gebruik.

Bekijk de onderstaande code:

 var MyView = Backbone.View.extend (template: _.template (myTemplate), initialize: function () // Old Backbone.js manier this.model.on ('change', this.render, this); / / of de nieuwe Backbone 0.9.10+ manier this.listenTo (this.model, 'change', this.render);, render: function () this. $ el.html (this.template (this.model. toJSON ())););

Het probleem met deze aanpak is dat elke keer dat een enkel kenmerk wordt gewijzigd, we de hele weergave opnieuw moeten renderen. Ook moeten we bij elke render het model converteren naar JSON. Als ten slotte de binding bidirectioneel is (wanneer het model wordt bijgewerkt, dus ook de DOM en andersom), moeten we nog meer logica toevoegen aan het beeld.

Dit voorbeeld gebruikte Underscore's sjabloon functie. Laten we aannemen dat de sjabloon die we erin hebben ingevoerd er zo uitziet:

 

De tags gebruiken <%= en %> Maak de sjabloon functie vervang die gebieden door de Voornaam en achternaam eigenschappen die bestaan ​​in de JSON die we vanuit het model hebben verzonden. We nemen aan dat het model beide attributen ook heeft.

Met ModelBinder kunnen we die template-tags verwijderen en normaal verzenden HTML. ModelBinder ziet de waarde van de naam attribuut op de invoer tag en wijst de waarde van het model voor die eigenschap automatisch toe aan de waarde kenmerk van de tag. Bijvoorbeeld de eerste invoer's naam is ingesteld op "firstName". Wanneer we ModelBinder gebruiken, zal het dat zien en vervolgens instellen invoer's waarde naar de modellen Voornaam eigendom.

Hieronder ziet u hoe ons vorige voorbeeld er uit zou zien na het overschakelen naar het gebruik van ModelBinder. Realiseer je ook dat de binding bidirectioneel is, dus als het invoer tags worden bijgewerkt, het model wordt automatisch voor ons bijgewerkt.

HTML-sjabloon:

 

JavaScript-weergave:

 var MyView = Backbone.View.extend (template: myTemplate, initialize: function () // Geen binding meer hier, render: function () // Gooi de HTML recht hierin. $ el.html (this .template); // Gebruik ModelBinder om het model te binden en modelBinder.bind te bekijken (this.model, this.el););

Nu hebben we schone HTML-sjablonen en we hebben maar één regel code nodig om de HTML van de weergave en de modellen samen te gebruiken modelBinder.bind. modelBinder.bind neemt twee vereiste argumenten en één optioneel argument. Het eerste argument is het model met de gegevens die aan de DOM worden gebonden. De tweede is het DOM-knooppunt dat recursief zal worden doorzocht, op zoek naar te maken bindingen. Het laatste argument is a verbindend object dat geavanceerde regels opgeeft voor hoe bindingen moeten worden gedaan, als u het standaardgebruik niet bevalt.

ModelBinder kan op meer dan alleen worden gebruikt invoer -tags. Het werkt op elk element. Als het element een bepaalde vorminvoer is, zoals invoer, kiezen, of textarea, het zal de waarden van dat element dienovereenkomstig bijwerken. Als u een element bindt, zoals a div of span, het plaatst de gegevens van het model tussen de openende en sluitende tags van dat element (bijv. [data gaat hier]).

Achter Backbone.ModelBinder zit meer dan wat ik hier heb gedemonstreerd, dus lees de documentatie in de GitHub-opslagplaats om er alles over te leren.


Conclusie

Dat slaat de boel op. Ik heb maar een handvol extensies en plug-ins behandeld, maar dit is wat ik beschouw als het meest nuttig.

Het Backbone-landschap verandert voortdurend. Als je een uitgebreide lijst met de verschillende Backbone-extensies wilt bekijken die beschikbaar zijn, ga je naar deze wiki-pagina, die het Backbone-team regelmatig bijwerkt.