Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Enkle JavaScript-abstraksjoner

Enkle JavaScript-abstraksjoner

A presentation in Norwegian on simple JavaScript abstractions

Avatar for Kim Joar Bekkelund

Kim Joar Bekkelund

August 31, 2012
Tweet

More Decks by Kim Joar Bekkelund

Other Decks in Programming

Transcript

  1. Hvorfor? $(document).ready(function() { $('#new-status form').submit(function(e) { e.preventDefault(); $.ajax({ url: '/status',

    data: { text: $('#new-status textarea').val() }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); $('#new-status textarea').val(''); } }); }); });
  2. $(document).ready(function() { $('#new-status form').submit(function(e) { e.preventDefault(); $.ajax({ url: '/status', data:

    { text: $('#new-status textarea').val() }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); $('#new-status textarea').val(''); } }); }); }); Hvorfor? PAGE EVENT USER EVENT NETWORK I/O NETWORK EVENT TEMPLATING ER DISSE TO RELATERT?
  3. Modeller $.ajax({ url: '/status', data: { text: $('#new-status textarea').val() },

    success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); $('#new-status textarea').val(''); } });
  4. function addStatus() { $.ajax({ url: '/status', data: { text: $('#new-status

    textarea').val() }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); $('#new-status textarea').val(''); } }); } addStatus(); Modeller
  5. function addStatus(text) { $.ajax({ url: '/status', data: { text: text

    }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); $('#new-status textarea').val(''); } }); } addStatus($('#new-status textarea').val()); Modeller
  6. addStatus({ text: 'test', success: function() { ... }, }); Jeg

    ønsker å skrive Istedenfor addStatus('test')
  7. addStatus({ text: 'test', success: function() { ... }, }); Jeg

    ønsker å skrive Istedenfor HER SKJER DET OFTE MYE HVA OM JEG ØNSKER Å KALLE DENNE FLERE PLASSER? addStatus('test')
  8. Eventer function addStatus(text) { $.ajax({ url: '/status’, data: { text:

    text }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); } }); }
  9. var events = new EventEmitter(); function addStatus(text) { $.ajax({ url:

    '/status', data: { text: text }, success: function(data) { $('#statuses ul').append('<li>' + data.status + '</li>'); } }); } Eventer
  10. Eventer var events = new EventEmitter(); function addStatus(text) { $.ajax({

    url: '/status', data: { text: text }, success: function(data) { events.emit('status:added', data.status); } }); }
  11. Eventer var events = new EventEmitter(); function addStatus(text) { $.ajax({

    url: '/status', data: { text: text }, success: function(data) { events.emit('status:added', data.status); } }); } events.addListener('status:added', function(status) { $('#statuses ul').append('<li>' + status + '</li>'); });
  12. Flere kan lytte function appendStatus() { ... } function updateStatusesCount()

    { ... } function clearStatusInput() { ... } events.addListener('status:added', updateStatusesCount); events.addListener('status:added', clearStatusInput); events.addListener('status:added', appendStatus); addStatus($('#new-status textarea').val());
  13. Flere kan lytte function appendStatus() { ... } function updateStatusesCount()

    { ... } function clearStatusInput() { ... } events.addListener('status:added', updateStatusesCount); events.addListener('status:added', clearStatusInput); events.addListener('status:added', appendStatus); addStatus($('#new-status textarea').val()); SINGLE RESPONSIBILITY ENKELT Å TESTE ENKLERE Å BRUKE
  14. Vårt view-API var el = $('#statuses ul'); var statusesView =

    new StatusesView(el); statusesView.appendStatus('test'); StatusesView er nå ansvarlig for alt relatert til DOM-en i statuslisten
  15. Implementasjon av view-API var StatusesView = function(el) { this.el =

    el; // jQuery objekt } StatusesView.prototype.appendStatus = function(status) { this.el.append('<li>' + status + '</li>'); // istedenfor $('#statuses ul').append(...) } Null stress — det er kun konvensjon!
  16. Lytte på event i viewet var StatusesView = function(el) {

    this.el = el; // binde event ... events.addListener('status:added', this.appendStatus, this); } StatusesView.prototype.appendStatus = function(status) { this.el.append('<li>' + status + '</li>'); } new StatusesView($('#statuses ul')); // instans av viewet addStatus('test'); // trigger 'status:added'
  17. Sette opp applikasjonen $(document).ready(function() { new StatusesView($('#statuses ul')); // her

    kalles addStatus }); function addStatus(status) { $.ajax({ // ... success: function(data) { events.emit('status:added', data.status); } }); }
  18. Eller, enda bedre $(document).ready(function() { var statuses = new Statuses();

    // model med add-metode new StatusesView($('#statuses ul'), statuses); }); —
  19. Vi har flyttet nettverkskall til Modeller Vi har flyttet DOM-håndtering

    til Views Vi kommuniserer med events istedenfor callback. Vi har kode som er mye enklere å teste.