Knockout.js is een populair open source (MIT) MVVM JavaScript-framework, gemaakt door Steve Sandersen. De website biedt geweldige informatie en demo's over het bouwen van eenvoudige applicaties, maar doet dit helaas niet voor grotere applicaties. Laten we wat van die gaten opvullen!
AMD is een JavaScript-module-indeling en een van de meest populaire (zoniet de meeste) frameworks is http://requirejs.org op https://twitter.com/jrburke. Het bestaat uit twee globale functies genaamd vereisen()
en bepalen()
, hoewel require.js ook een JavaScript-startbestand bevat, zoals main.js
.
Er zijn in de eerste plaats twee smaken van require.js: een vanille require.js
bestand en een bestand dat jQuery bevat (vereisen-jquery
). Uiteraard wordt de laatste voornamelijk gebruikt in jQuery-enabled websites. Nadat u een van deze bestanden aan uw pagina heeft toegevoegd, kunt u de volgende code aan uw toevoegen main.js
het dossier:
vereisen (["https://twitter.com/jrburkeapp"], functie (App) App.init ();)
De vereisen()
functie wordt meestal gebruikt in de main.js
bestand, maar u kunt het gebruiken om direct een module op te nemen. Het accepteert twee argumenten: een lijst met afhankelijkheden en een callback-functie.
De callback-functie wordt uitgevoerd als alle afhankelijkheden zijn voltooid en de argumenten die aan de callback-functie worden doorgegeven, de objecten zijn verplicht in de bovengenoemde reeks.
Het is belangrijk op te merken dat de afhankelijkheden asynchroon laden. Niet alle bibliotheken zijn AMD-compatibel, maar require.js biedt een mechanisme om die typen bibliotheken te vullen zodat ze kunnen worden geladen.
Voor deze code is een module vereist app
, wat er als volgt uit zou kunnen zien:
define (["jQuery", "ko"], function ($, ko) var App = function () ; App.prototype.init = function () // INIT ALL TEH THINGS; retourneer nieuwe app ( ););
De bepalen()
functie doel is om een te definiëren module. Het accepteert drie argumenten: de naam van de module (wat is typisch niet inbegrepen), een lijst met afhankelijkheden en een callback-functie. De bepalen()
Met de functie kunt u een toepassing scheiden in meerdere modules, elk met een specifieke functie. Dit bevordert de ontkoppeling en scheiding van punten van zorg, omdat elke module zijn eigen specifieke verantwoordelijkheden heeft.
Knockout is AMD ready en definieert zichzelf als een anonieme module. Je hoeft het niet te vullen; voeg het gewoon toe aan je paden. De meeste voor AMD geschikte Knockout-plug-ins vermelden het als "knock-out" in plaats van "ko", maar u kunt elke waarde gebruiken:
require.config (paths: ko: "vendor / knockout-min", postal: "vendor / postal", onderstrepingsteken: "vendor / underscore-min", amplify: "vendor / amplify", shim: underscore: exports: "_", amplify: exports: "amplify", baseUrl: "/ js");
Deze code staat bovenaan main.js
. De paden
optie definieert een kaart van gemeenschappelijke modules die laden met een sleutelnaam in tegenstelling tot het gebruik van de volledige bestandsnaam.
De shim
optie gebruikt een sleutel die is gedefinieerd in paden
en kan twee speciale toetsen hebben genoemd export
en deps
. De export
key definieert wat de geremde module retourneert, en deps
definieert andere modules waarop de opgevulde module kan zijn gebaseerd. Het vulstuk van jQuery Validate ziet er bijvoorbeeld als volgt uit:
shim: // ... "jQuery-validate": deps: ["jquery"]
Het is gebruikelijk om al het benodigde JavaScript op te nemen in een toepassing met één pagina. U kunt dus de configuratie en de initiële vereisten van een toepassing met één pagina definiëren in main.js
zoals zo:
require.config (paths: ko: "vendor / knockout-min", postal: "vendor / postal", onderstrepingsteken: "vendor / underscore-min", amplify: "vendor / amplify", shim: ko: exports: "ko", onderstrepingsteken: exports: "_", amplify: exports: "amplify", baseUrl: "/ js"); vereisen (["https://twitter.com/jrburkeapp"], functie (App) App.init ();)
Mogelijk hebt u ook aparte pagina's nodig die niet alleen paginaspecifieke modules bevatten, maar ook een gemeenschappelijke reeks modules delen. James Burke heeft twee repositories die dit soort gedrag implementeren.
In de rest van dit artikel wordt ervan uitgegaan dat u een toepassing met meerdere pagina's maakt. Ik zal de naam wijzigen main.js
naar common.js
en neem het nodige op require.config
in het bovenstaande voorbeeld in het bestand. Dit is puur voor semantiek.
Nu zal ik vereisen common.js
in mijn bestanden, zoals dit: