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

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.