<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dzemal Becirevic</title>
	<atom:link href="http://dzemo.se/feed" rel="self" type="application/rss+xml" />
	<link>http://dzemo.se</link>
	<description>utvecklingsblogg</description>
	<lastBuildDate>Tue, 08 May 2012 17:29:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>inaktivitet som vanligt</title>
		<link>http://dzemo.se/ria/inaktivitet-som-vanligt</link>
		<comments>http://dzemo.se/ria/inaktivitet-som-vanligt#comments</comments>
		<pubDate>Tue, 08 May 2012 17:29:42 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=276</guid>
		<description><![CDATA[Som jag trodde, efter att kursen vart avslutad så har jag inte skrivit någonting alls här på bloggen. Visste egentligen att det skulle bli så men vad ska man göra, är väl helt enkelt för att jag känner att jag &#8230; <a href="http://dzemo.se/ria/inaktivitet-som-vanligt">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Som jag trodde, efter att kursen vart avslutad så har jag inte skrivit någonting alls här på bloggen. Visste egentligen att det skulle bli så men vad ska man göra, är väl helt enkelt för att jag känner att jag inte har något vettigt att skriva om.</p>
<p>Håller förnärvarande på med examensarbete på C-nivå med Qben, det går framåt även om det känns som att vi har slackat en hel del men vi kommer bli klara, no doubt!</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/inaktivitet-som-vanligt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 05 &#8211; utvärdering</title>
		<link>http://dzemo.se/ria/steg-05-utvardering</link>
		<comments>http://dzemo.se/ria/steg-05-utvardering#comments</comments>
		<pubDate>Mon, 19 Mar 2012 08:31:10 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=295</guid>
		<description><![CDATA[Då har vi kommit till utvärderingen utav kursen, projektet och allt där emellan. Min (nya) relation till Javascript Min relation till JavaScript har förändrats en hel del sedan den första kursen inom det, och nu känner jag att jag inte &#8230; <a href="http://dzemo.se/ria/steg-05-utvardering">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Då har vi kommit till utvärderingen utav kursen, projektet och allt där emellan.</p>
<h2>Min (nya) relation till Javascript</h2>
<p>Min relation till JavaScript har förändrats en hel del sedan den första kursen inom det, och nu känner jag att jag inte enbart kommer använda det genom jQuery för animeringar och effekter.</p>
<p>Efter att ha spenderat den här läsperioden med Backbone så har det faktiskt blivit en god kompanjon inom webbutvecklingen. Jag har implementerat ett antal olika applikationer efter att ha skrivit klart min Todo applikation för kursen, bland andra så har jag skrivit en egen kontakt applikation som finns <a href="http://dzemo.se/dev/contacts/">här</a> och så har jag skrivit ett antal andra &#8221;lek&#8221; applikationer bara för att lära mig använda Backbone ännu mer.</p>
<p>Jag har även experimenterat en del med att använda MongoDB (Hosting lösning från <a href="https://mongohq.com/home">MongoHQ</a>) där jag lärde mig hur man kan implementera ett &#8221;mini-api&#8221; i PHP för att CRUD mot en bakomliggande databas. Det som förvånade mig mest med detta var hur enkelt det var att implementera användandet av en bakomliggande databas i modellerna/collectionerna, endast en url egenskap behövdes sättas och så fick PHP sköta resten. Det som underlättade ännu ett snäpp till var att Backbone automatiskt skickade rätt HTTP headers (GET, POST, PUT, DELETE) så att man endast behövde kolla vilken request typ headern bestod av för att kunna utföra de olika CRUD funktionerna. Mycket Smidigt!</p>
<h2>Kursen</h2>
<p>Jag tycker att kursen har varit väldigt rolig, främst så har det varit väldigt givande för min relation mot Javascript men den har även hjälpt mig förstå kraften med att planera och identifiera objekt, metoder, moduler och funktioner inom en applikation innan själva implementeringen drar igång. Detta såg jag som en klar fördel, eftersom det klart blev enklare att veta hur allting skulle fungera och hur applikationen som helhet skulle se ut.</p>
<p>Kontakten med David har varit väldigt god, vi har flera gånger spenderat lång tid med långa samtal kring buggar, funderingar, lösningar osv. Och i vissa fall har vi båda nästan blivit skalliga hehe.</p>
<h2>Sammanfattning</h2>
<p>Kursen har gett mig mycket, både i planeringsstadiet och själva implementationsstadiet. Det jag känner har varit mest givande är min nya relation med Javascript och den kommer jag att fortsätta utveckla i framtiden så mycket jag bara kan, bara baka ihop allting jag kan och skapa något jag verkligen kan vara stolt över.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-05-utvardering/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 04 &#8211; fördjupning &#8211; Backbone vs. Spine</title>
		<link>http://dzemo.se/ria/steg-04-fordjupning-backbone-vs-spine</link>
		<comments>http://dzemo.se/ria/steg-04-fordjupning-backbone-vs-spine#comments</comments>
		<pubDate>Sun, 18 Mar 2012 09:52:31 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=281</guid>
		<description><![CDATA[Todo &#8211; Backbone vs. Spine Min tanke är att använda mig utav Addy Osmanis TodoMVC projekt som är en Todo-applikation skriven i många olika ramverk och tekniker inom JavaScript. Du kan kika på projektet här. Det är fler utvecklare inblandade &#8230; <a href="http://dzemo.se/ria/steg-04-fordjupning-backbone-vs-spine">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Todo &#8211; Backbone vs. Spine</p>
<p>Min tanke är att använda mig utav Addy Osmanis TodoMVC projekt som är en Todo-applikation skriven i många olika ramverk och tekniker inom JavaScript. Du kan kika på projektet <a href="http://addyosmani.github.com/todomvc/">här</a>. Det är fler utvecklare inblandade i projektet men Addy är lead.<br />
Tanken är helt enkelt att jämför de olika implementationerna mellan hur applikationen är implementerad i Backbone och Spine. Jag kommer inte fördjupa mig någonting i Hur Spine används utan enkelt försöka förklara skillnaderna i varje Modell, Vy och Controller på en grundläggande nivå.</p>
<p>Eftersom SpineJS är CoffeScript så passar det bra att nämna min <a href="http://www.dzemo.se/ria/steg-04-fordjupning-coffescript">grundläggande artikel om CoffeScript</a>.</p>
<h2>Modell</h2>
<p>Vi börjar med att kika på vad det är för skillnad på modellerna i Backbone respektive Spine.</p>
<p><b>Model i Backbone</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Todo <span style="color: #339933;">=</span> Backbone.<span style="color: #660066;">Model</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Default attributes for the todo.</span>
    defaults<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
      content<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;empty todo...&quot;</span><span style="color: #339933;">,</span>
      done<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Ensure that each todo created has `content`.</span>
    initialize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;content&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">set</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;content&quot;</span><span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">content</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Toggle the `done` state of this todo item.</span>
    toggle<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>done<span style="color: #339933;">:</span> <span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;done&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Remove this Todo from *localStorage* and delete its view.</span>
    clear<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><b>Model i Spine</b> (Tyvärr så har itne WP-Syntax stöd för CoffeScript)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">class</span> window.<span style="color: #660066;">Task</span> <span style="color: #003366; font-weight: bold;">extends</span> Spine.<span style="color: #660066;">Model</span>
  <span style="color: #339933;">@</span>configure <span style="color: #3366CC;">'Task'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'name'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'done'</span>
  <span style="color: #339933;">@</span>extend Spine.<span style="color: #660066;">Model</span>.<span style="color: #660066;">Local</span>
&nbsp;
  validate<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #3366CC;">'Task name is required'</span> unless $.<span style="color: #660066;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span>
&nbsp;
  <span style="color: #339933;">@</span>active<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>select <span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> <span style="color: #339933;">!</span>task.<span style="color: #660066;">done</span>
&nbsp;
  <span style="color: #339933;">@</span>done<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>select <span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> <span style="color: #339933;">!!</span>task.<span style="color: #660066;">done</span>
&nbsp;
  <span style="color: #339933;">@</span>destroyDone<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    task.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">for</span> task <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #339933;">@</span>done<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Backbone modellen ser ganska identisk ut med hur vi har gjort under kursen med våra egna applikationer så där behöver väl jag inte nämna någonting speciellt, förutom ett annat sätt att sätta default-värden på modellerna vilket jag inte visste att man kunde göra på detta vis. Vi kan även notera här att @ används istället för att this (t.ex. this.egenskap => @egenskap). Även om syntaxen verkar vara lite klurig att läsa/förstå så går det enkelt när man har läst på om hur CoffeScript fungerar och dess syntax.</p>
<h2>Router/Controller</h2>
<p>Vad jag kan se i Backbone implementationen av Todo applikationen så finns det ingen router, så denna kan jag inte göra någon jämförelse mot, däremot kan jag nämna att SpineJS använder sig utav controllers.</p>
<p>app.coffe &#8211; Huvudcontroller för applikationen</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">class</span> TaskApp <span style="color: #003366; font-weight: bold;">extends</span> Spine.<span style="color: #660066;">Controller</span>
  elements<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'.items'</span><span style="color: #339933;">:</span>                         <span style="color: #3366CC;">'tasks'</span>
    <span style="color: #3366CC;">'.countVal'</span><span style="color: #339933;">:</span>                      <span style="color: #3366CC;">'counter'</span>
    <span style="color: #3366CC;">'a.clear'</span><span style="color: #339933;">:</span>                        <span style="color: #3366CC;">'clearCompleted'</span>
    <span style="color: #3366CC;">'form#new-task input[name=name]'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'newTaskName'</span>
&nbsp;
  events<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'submit form#new-task'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'new'</span>
    <span style="color: #3366CC;">'click a.clear'</span><span style="color: #339933;">:</span>        <span style="color: #3366CC;">'clearCompleted'</span>
&nbsp;
  constructor<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #003366; font-weight: bold;">super</span>
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'create'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderNew
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderAll
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh change'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderCounter
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh change'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>toggleClearCompleted
    Task.<span style="color: #660066;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">new</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    Task.<span style="color: #660066;">fromForm</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'form#new-task'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>newTaskName.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span>
&nbsp;
  renderNew<span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span>
    view <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Tasks<span style="color: #009900;">&#40;</span>task<span style="color: #339933;">:</span> task<span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>tasks.<span style="color: #660066;">append</span> view.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">el</span>
&nbsp;
  renderAll<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    Task.<span style="color: #660066;">each</span> <span style="color: #339933;">@</span>renderNew
&nbsp;
  renderCounter<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    <span style="color: #339933;">@</span>counter.<span style="color: #660066;">text</span> Task.<span style="color: #660066;">active</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span>
&nbsp;
  toggleClearCompleted<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    <span style="color: #000066; font-weight: bold;">if</span> Task.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span>
      <span style="color: #339933;">@</span>clearCompleted.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">else</span>
      <span style="color: #339933;">@</span>clearCompleted.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  clearCompleted<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    Task.<span style="color: #660066;">destroyDone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
&nbsp;
$ <span style="color: #339933;">-&gt;</span>
  <span style="color: #003366; font-weight: bold;">new</span> TaskApp<span style="color: #009900;">&#40;</span>el<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#tasks'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Efter att ha kikat på koden en snabbis så framgår det att upplägget för applikationen i både Backbone och Spine är väldigt likt. Controllern börjar med att definera vilka element som den ska använda sig utav, definerar events och har en constructor (motsvarighet till Backbones initialize) där han binder event för Task-objektet (De verkar inte finns någon motsvarighet till Backbone collections i Spine). Sedan är det helt vanliga funktioner enligt vanlig Backbone standard kan man säga. Vad jag kan se så händer det inget här som man inte kan förstå. Det ända jag kan notera i controllern är att den faktiskt mer liknar en Backbone vy än en Backbone router.</p>
<h2>Vyer</h2>
<p>Vi vet alla hur en vy i Backbone ser ut, men för att förenkla jämförelsen så kommer AppView:n här.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Our overall **AppView** is the top-level piece of UI.</span>
  <span style="color: #003366; font-weight: bold;">var</span> AppView <span style="color: #339933;">=</span> Backbone.<span style="color: #660066;">View</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Instead of generating a new element, bind to the existing skeleton of</span>
    <span style="color: #006600; font-style: italic;">// the App already present in the HTML.</span>
    el<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#todoapp&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Our template for the line of statistics at the bottom of the app.</span>
    statsTemplate<span style="color: #339933;">:</span> _.<span style="color: #660066;">template</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#stats-template'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Delegated events for creating new items, and clearing completed ones.</span>
    events<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #3366CC;">&quot;keypress #new-todo&quot;</span><span style="color: #339933;">:</span>  <span style="color: #3366CC;">&quot;createOnEnter&quot;</span><span style="color: #339933;">,</span>
      <span style="color: #3366CC;">&quot;keyup #new-todo&quot;</span><span style="color: #339933;">:</span>     <span style="color: #3366CC;">&quot;showTooltip&quot;</span><span style="color: #339933;">,</span>
      <span style="color: #3366CC;">&quot;click .todo-clear a&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;clearCompleted&quot;</span><span style="color: #339933;">,</span>
      <span style="color: #3366CC;">&quot;click .mark-all-done&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;toggleAllComplete&quot;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// At initialization we bind to the relevant events on the `Todos`</span>
    <span style="color: #006600; font-style: italic;">// collection, when items are added or changed. Kick things off by</span>
    <span style="color: #006600; font-style: italic;">// loading any preexisting todos that might be saved in *localStorage*.</span>
    initialize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      _.<span style="color: #660066;">bindAll</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'addOne'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'addAll'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'render'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'toggleAllComplete'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">input</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#new-todo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">allCheckbox</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.mark-all-done&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
      Todos.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'add'</span><span style="color: #339933;">,</span>     <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">addOne</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Todos.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'reset'</span><span style="color: #339933;">,</span>   <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">addAll</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Todos.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'all'</span><span style="color: #339933;">,</span>     <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">render</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      Todos.<span style="color: #660066;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Re-rendering the App just means refreshing the statistics -- the rest</span>
    <span style="color: #006600; font-style: italic;">// of the app doesn't change.</span>
    render<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> done <span style="color: #339933;">=</span> Todos.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> remaining <span style="color: #339933;">=</span> Todos.<span style="color: #660066;">remaining</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">this</span>.$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#todo-stats'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">statsTemplate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        total<span style="color: #339933;">:</span>      Todos.<span style="color: #660066;">length</span><span style="color: #339933;">,</span>
        done<span style="color: #339933;">:</span>       done<span style="color: #339933;">,</span>
        remaining<span style="color: #339933;">:</span>  remaining
      <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">allCheckbox</span>.<span style="color: #660066;">checked</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span>remaining<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Add a single todo item to the list by creating a view for it, and</span>
    <span style="color: #006600; font-style: italic;">// appending its element to the `&lt;ul&gt;`.</span>
    addOne<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>todo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> view <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> TodoView<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>model<span style="color: #339933;">:</span> todo<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#todo-list&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span>view.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">el</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Add all items in the **Todos** collection at once.</span>
    addAll<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      Todos.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">addOne</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Generate the attributes for a new Todo item.</span>
    newAttributes<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
        content<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">input</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        order<span style="color: #339933;">:</span>   Todos.<span style="color: #660066;">nextOrder</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        done<span style="color: #339933;">:</span>    <span style="color: #003366; font-weight: bold;">false</span>
      <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// If you hit return in the main input field, create new **Todo** model,</span>
    <span style="color: #006600; font-style: italic;">// persisting it to *localStorage*.</span>
    createOnEnter<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">keyCode</span> <span style="color: #339933;">!=</span> <span style="color: #CC0000;">13</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
      Todos.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">newAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">input</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Clear all done todo items, destroying their models.</span>
    clearCompleted<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      _.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span>Todos.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>todo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> todo.<span style="color: #660066;">clear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Lazily show the tooltip that tells you to press `enter` to save</span>
    <span style="color: #006600; font-style: italic;">// a new todo item, after one second.</span>
    showTooltip<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> tooltip <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.ui-tooltip-top&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> val <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">input</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      tooltip.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">tooltipTimeout</span><span style="color: #009900;">&#41;</span> clearTimeout<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">tooltipTimeout</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>val <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">||</span> val <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">input</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> show <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> tooltip.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">tooltipTimeout</span> <span style="color: #339933;">=</span> _.<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span>show<span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    toggleAllComplete<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> done <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">allCheckbox</span>.<span style="color: #660066;">checked</span><span style="color: #339933;">;</span>
      Todos.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>todo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> todo.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'done'</span><span style="color: #339933;">:</span> done<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En helt vanlig Backbone vy.</p>
<p>Nu blir det lite repetition här men det är för att (som jag nämnde ovan) att controllers i Spine verkar fungera som vyer också. Nedan kommer samma controller som ovan:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">class</span> TaskApp <span style="color: #003366; font-weight: bold;">extends</span> Spine.<span style="color: #660066;">Controller</span>
  elements<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'.items'</span><span style="color: #339933;">:</span>                         <span style="color: #3366CC;">'tasks'</span>
    <span style="color: #3366CC;">'.countVal'</span><span style="color: #339933;">:</span>                      <span style="color: #3366CC;">'counter'</span>
    <span style="color: #3366CC;">'a.clear'</span><span style="color: #339933;">:</span>                        <span style="color: #3366CC;">'clearCompleted'</span>
    <span style="color: #3366CC;">'form#new-task input[name=name]'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'newTaskName'</span>
&nbsp;
  events<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'submit form#new-task'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'new'</span>
    <span style="color: #3366CC;">'click a.clear'</span><span style="color: #339933;">:</span>        <span style="color: #3366CC;">'clearCompleted'</span>
&nbsp;
  constructor<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #003366; font-weight: bold;">super</span>
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'create'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderNew
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderAll
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh change'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>renderCounter
    Task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'refresh change'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>toggleClearCompleted
    Task.<span style="color: #660066;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">new</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    Task.<span style="color: #660066;">fromForm</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'form#new-task'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>newTaskName.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span>
&nbsp;
  renderNew<span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span>
    view <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Tasks<span style="color: #009900;">&#40;</span>task<span style="color: #339933;">:</span> task<span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>tasks.<span style="color: #660066;">append</span> view.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">el</span>
&nbsp;
  renderAll<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    Task.<span style="color: #660066;">each</span> <span style="color: #339933;">@</span>renderNew
&nbsp;
  renderCounter<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    <span style="color: #339933;">@</span>counter.<span style="color: #660066;">text</span> Task.<span style="color: #660066;">active</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span>
&nbsp;
  toggleClearCompleted<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    <span style="color: #000066; font-weight: bold;">if</span> Task.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span>
      <span style="color: #339933;">@</span>clearCompleted.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">else</span>
      <span style="color: #339933;">@</span>clearCompleted.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  clearCompleted<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    Task.<span style="color: #660066;">destroyDone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
&nbsp;
$ <span style="color: #339933;">-&gt;</span>
  <span style="color: #003366; font-weight: bold;">new</span> TaskApp<span style="color: #009900;">&#40;</span>el<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#tasks'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Det finns även en till controller i Spine applikationen som definerar en controller för varje task-object, som fasktiskt verkar användas som en vy här innuti renderNew funtionen. Jag hade nog mer valt att kalla den för en sorts partiel vy, men det är nog för att jag kommer från Backbone och hade säkerligen tyckt att Backbone gör det konstigt om jag kommit från Spine.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">class</span> window.<span style="color: #660066;">Tasks</span> <span style="color: #003366; font-weight: bold;">extends</span> Spine.<span style="color: #660066;">Controller</span>
  ENTER_KEY  <span style="color: #339933;">=</span> <span style="color: #CC0000;">13</span>
  ESCAPE_KEY <span style="color: #339933;">=</span> <span style="color: #CC0000;">27</span>
&nbsp;
  elements<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'form.edit'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'form'</span>
&nbsp;
  events<span style="color: #339933;">:</span>
    <span style="color: #3366CC;">'click a.destroy'</span><span style="color: #339933;">:</span>            <span style="color: #3366CC;">'remove'</span>
    <span style="color: #3366CC;">'click input[type=checkbox]'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'toggleStatus'</span>
    <span style="color: #3366CC;">'dblclick .view'</span><span style="color: #339933;">:</span>             <span style="color: #3366CC;">'edit'</span>
    <span style="color: #3366CC;">'keypress input[type=text]'</span><span style="color: #339933;">:</span>  <span style="color: #3366CC;">'finishEditOnEnter'</span>
    <span style="color: #3366CC;">'blur input[type=text]'</span><span style="color: #339933;">:</span>      <span style="color: #3366CC;">'finishEdit'</span>
&nbsp;
  constructor<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #003366; font-weight: bold;">super</span>
    <span style="color: #339933;">@</span>task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'update'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>render
    <span style="color: #339933;">@</span>task.<span style="color: #660066;">bind</span> <span style="color: #3366CC;">'destroy'</span><span style="color: #339933;">,</span> <span style="color: #339933;">@</span>release
&nbsp;
  render<span style="color: #339933;">:</span> <span style="color: #339933;">=&gt;</span>
    <span style="color: #339933;">@</span>replace $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#task-template'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">tmpl</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span>task<span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">this</span>
&nbsp;
  remove<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>task.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  toggleStatus<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>task.<span style="color: #660066;">updateAttribute</span> <span style="color: #3366CC;">'done'</span><span style="color: #339933;">,</span> <span style="color: #339933;">!@</span>task.<span style="color: #660066;">done</span>
&nbsp;
  edit<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>el.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'editing'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input[name=name]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  finishEdit<span style="color: #339933;">:</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #339933;">@</span>el.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'editing'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">@</span>task.<span style="color: #660066;">fromForm</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span>form<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
  finishEditOnEnter<span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #000066; font-weight: bold;">if</span> e.<span style="color: #660066;">keyCode</span> <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #009900;">&#91;</span>ENTER_KEY<span style="color: #339933;">,</span> ESCAPE_KEY<span style="color: #009900;">&#93;</span> then <span style="color: #339933;">@</span>finishEdit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Här känner jag även att, med utgångspunkt från min Todo-applikation, att det här borde finnas direkt på modellen och inte på en controller/vy. Men allt beror självklart på hur man väljer att implementera sin applikation.</p>
<h2>Slutsats</h2>
<p>Efter att ha läst på, och skrivit en artikel om grunderna i CoffeScript, och sedan kikat igenom koden för Backbone respektive Spine så känner jag att implementationerna är nästan identiska med varandra. Detta kanske beror på att de är skriva av samma person/personer men jag trodde faktiskt först att det skulle vara större skillnad syntax och struktur mässigt än vad det faktiskt var.</p>
<p>Jag känner att man blir lite små förvirrad över vad som egentligen är en vy och vad som är en controller i Spine, kanske faller det på valet av hur applikationen är implementerad men jag blev lite förvirrad just när det gäller dessa två typer av objekt. Enligt den här implementationen så framgår det ganska klart och tydligt att controller är en typ controller och vy, och att det inte direkt finns någon uppdelning av dessa.</p>
<p>Med en del Backbone kunskap och en grundläggande överblick över hur CoffeScript fungerar så kan jag klart och tydligt se att Spine implementationen klart är mycket mer lättläst och enklare att förstå. Detta beror antagligen mest på skillnaden i hur syntax ser ut i CoffeScript som Spine är skrivet i, det ger klara fördelar om man kan syntaxen, framför allt så sparar det en hel del tråkiga klammrar och långa filer.</p>
<p>Jag kommer nog definitiv att kika mer på Spine/CoffeScript och börja skriva applikationer i detta språk, men först måste jag få upp en fungerande Node server som inte riktigt gick som jag tänkt förra gången jag försökte mig på detta.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-04-fordjupning-backbone-vs-spine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 04 &#8211; fördjupning &#8211; coffescript</title>
		<link>http://dzemo.se/ria/steg-04-fordjupning-coffescript</link>
		<comments>http://dzemo.se/ria/steg-04-fordjupning-coffescript#comments</comments>
		<pubDate>Sun, 18 Mar 2012 09:18:31 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=285</guid>
		<description><![CDATA[Alla som arbetar med webben på utvecklingssidan har nog hört talas om CoffeScript, ett helt nytt sätt att skriva på. CoffeScript må ser annorlunda ut i syntaxen, men det kompileras alltid till helt vanlig &#8221;Raw&#8221;-JavaScript. CoffeScript kommer att benämnas CS &#8230; <a href="http://dzemo.se/ria/steg-04-fordjupning-coffescript">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Alla som arbetar med webben på utvecklingssidan har nog hört talas om CoffeScript, ett helt nytt sätt att skriva på. CoffeScript må ser annorlunda ut i syntaxen, men det kompileras alltid till helt vanlig &#8221;Raw&#8221;-JavaScript. CoffeScript kommer att benämnas CS i resterande delar av artikeln.</p>
<p>I den här artikeln så tänkte jag bara gå igenom skillnaderna mellan CS och JavaScript, mest för utbildningssyfte men även som en fördjupning av min jämförelse mellan Todo Backbone och Todo SpineJS (Som är skrivet i CS).</p>
<p><em>Ett måste för att kunna kompilera CS är <a href="http://nodejs.org">NodeJS</a>.</em> Jag kommer endast att gå igenom lite grundläggande syntax i CS så som variabler, funktioner, loopar, object, arrayer och villkorliga tilldelningar (If, else.. ).</p>
<h2>CoffeScript</h2>
<p>CoffeScript, tillskillnad från vanlig JavaScript, använder sig utan mellanslag (whitespace) för att avgränsa kod block. Man behöver inte använda sig utav semikolon (;) för att avsluta rader, och måsvingar/klammerparanteser {} blir ett minneblott då man istället använder sig av indentering. CS är helt enkelt mycket enklare att läsa utan massa kodblock med konstiga klammrar och indenteringar.</p>
<h3>Funktioner</h3>
<p>Alla vet vi väl hur det ser ut när man definerar en funktion i JavaScript, om inte så kommer en påminnelse här.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> cube<span style="color: #339933;">,</span> square<span style="color: #339933;">;</span>
&nbsp;
square <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> x <span style="color: #339933;">*</span> x<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
cube <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> square<span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> x<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Förstår du inte detta, så har du nog kommit helt fel. Men, hur definerar jag samma funktion i CS? Jo då, så här:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">square <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    x <span style="color: #339933;">*</span> x
&nbsp;
cube <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    square<span style="color: #009900;">&#40;</span> x <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> x</pre></td></tr></table></div>

<p>Ganska simpelt va? Sparar en del onödiga tecken i källkoden, även om den automatiskt kommer kompileras till vanliga javascript för använding.</p>
<p>Default värden för funktioner har man tidigare behövt skriva på de sättet att man först kollar om det variablen inte är null, om den är det så sätter man ett default värde, i CS är det enklare och fungerar så här:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">orderDrink <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> sizeOfCup<span style="color: #339933;">,</span> drink <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;coffe&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span>
    <span style="color: #3366CC;">&quot;I would like a #{sizeOfCup} with #{drink}&quot;</span></pre></td></tr></table></div>

<p>I princip identiskt med hur man skulle sätta ett default värde i t.ex. PHP. Notera även sättet att skriva ut variabler i strängar.</p>
<h2>Objekt och arrayer</h2>
<p>Objekt och arrayer fungerar likadant som vanligt i JavaScript, så det här borde inte vara allt för svårt att förstå.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Array</span>
playlist <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;Rededication to my Ex&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Mo money mo problems&quot;</span><span style="color: #009900;">&#93;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Objekt</span>
albums <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> Lloyd <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Untitled&quot;</span><span style="color: #339933;">,</span> BIG <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Life after death&quot;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Du beöver inte använda dig utav komma (,) när du definerar element</span>
<span style="color: #006600; font-style: italic;">// i arrayer eller objekt, det går lika bra med whitespace.</span>
numbers <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span>
    <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span>
    <span style="color: #CC0000;">1</span> <span style="color: #CC0000;">1</span> <span style="color: #CC0000;">1</span> <span style="color: #CC0000;">0</span>
<span style="color: #009900;">&#93;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Ytterliggare objekt.</span>
artists <span style="color: #339933;">=</span> 
    Tupac<span style="color: #339933;">:</span>
        album <span style="color: #339933;">:</span> <span style="color: #3366CC;">'All eyes on me'</span>
        year <span style="color: #339933;">:</span> <span style="color: #CC0000;">1996</span>
        label <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Death Row Records'</span>
    Game<span style="color: #339933;">:</span>
        album <span style="color: #339933;">:</span> <span style="color: #3366CC;">'The R.E.D Album'</span>
        year <span style="color: #339933;">:</span> <span style="color: #CC0000;">2011</span>
        label <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Geffen/Aftermath'</span></pre></td></tr></table></div>

<h2>Villkorliga tilldelningar</h2>
<p>Det mesta i CoffeScript är verkligen lättläst, speciellt if..else-satser.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">mood <span style="color: #339933;">=</span> topOfTheWorld <span style="color: #000066; font-weight: bold;">if</span> finished
&nbsp;
<span style="color: #000066; font-weight: bold;">if</span> finished and topOfTheWorld
   goBuyABeer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000066; font-weight: bold;">else</span>
   tryAgain<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Det måste vara en av de kortaste if satserna jag sett! Nedan följer motsvarigheten i ren JavaScript. Skillnaden i läsbarheten är verkligen enorm.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> mood<span style="color: #339933;">,</span> topOfTheWorld<span style="color: #339933;">,</span> finished<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> finished <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    mood <span style="color: #339933;">=</span> topOfTheWorld<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> finished <span style="color: #339933;">&amp;&amp;</span> topOfTheWorld <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    goBuyABeer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    tryAgain<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Loopar</h2>
<p>Vi alla vet hur jobbiga, i vissa fall, utmannande For-loopar kan vara, men vet ni vad? De blir också enklare i CoffeScript.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Loopa igenom food och skicka till eat() för varje element i </span>
&nbsp;
arrayen. 
<span style="color: #660066;">eat</span> food <span style="color: #000066; font-weight: bold;">for</span> food <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'cerial'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'cheese'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'wine'</span><span style="color: #009900;">&#93;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Loopa igenom måltider och plugga på i, skicka till menu()</span>
courses <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'greens'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'caviar'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'truffles'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'roast'</span><span style="color: #009900;">&#93;</span>
menu i <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> dish <span style="color: #000066; font-weight: bold;">for</span> dish<span style="color: #339933;">,</span> i <span style="color: #000066; font-weight: bold;">in</span> courses</pre></td></tr></table></div>

<h2>Operatorer och alias</h2>
<p>För att läsa mer om de olika operationerna och aliasen som finns i CoffeScript, <a href="http://coffeescript.org/#operators">besök den här sidan.</a></p>
<h2>Slutsats</h2>
<p>Nu har jag inte gått in på djupet och undersökt exakt hur CS fungerar, men jag hoppas i alla fall att ni har fått en hum om vad det går ut på och hur enkelt och lättläst det är. Nu har jag endast skrapat lite på ytan och inte kikat på några större applikationer skrivna i CS men det är därför jag har skrivit den här artikeln, för att bilda mig en grundläggande förståelse över syntaxen och hur den användas. Nu ska denna lärdom appliceras genom att Todo SpineJS av Addy Osmani ska undersökas, och jämföras med samma applikation i Backbone.</p>
<p><i>Källa: <a href="http://coffescript.org">coffescript.org</a></i></p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-04-fordjupning-coffescript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 04 &#8211; fördjupning</title>
		<link>http://dzemo.se/ria/steg-04-fordjupning</link>
		<comments>http://dzemo.se/ria/steg-04-fordjupning#comments</comments>
		<pubDate>Thu, 15 Mar 2012 09:39:27 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=277</guid>
		<description><![CDATA[Då var man framme vid fördjupningen, och jag har både funderat på att fördjupa mig inom NodeJS eller en jämförelse mellan Backbone och SpineJS. Jag har haft annat för mig, tack vare det fina vädret här i Norrköping så det &#8230; <a href="http://dzemo.se/ria/steg-04-fordjupning">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Då var man framme vid fördjupningen, och jag har både funderat på att fördjupa mig inom NodeJS eller en jämförelse mellan Backbone och SpineJS. Jag har haft annat för mig, tack vare det fina vädret här i Norrköping så det har inte blivit så mycket gjort men jag ska ta tag i det nu idag eller till helgen och självklart göra klart det med.</p>
<p>Försökte få upp en NodeJS server på min windows maskin men tyvärr så får jag bara fram &#8216;Undefined&#8217; hur jag än försöker så kanske har jag gjort någonting fel? Det återstår att se men ska försöka fördjupa mig inom Addy Osmanis <a href="http://addyosmani.github.com/todomvc/">TodoMVC</a>. Då specifik inriktat på skillnaden mellan Todo applikationen i Backbone och Spine.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-04-fordjupning/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 03 – kollaborering – marta</title>
		<link>http://dzemo.se/ria/steg-03-kollaborering-marta</link>
		<comments>http://dzemo.se/ria/steg-03-kollaborering-marta#comments</comments>
		<pubDate>Thu, 08 Mar 2012 08:38:05 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=273</guid>
		<description><![CDATA[Idag så har jag gjort en fork och en pull request mot Martas app. Det jag har ändrat/implementerat i hennes app är följand: Tagit bort &#8221;överlödiga&#8221; jquery selectorer och lagt dess i create direkt istället. &#8216;artistAdded&#8217;-eventet har jag ändrat eftersom &#8230; <a href="http://dzemo.se/ria/steg-03-kollaborering-marta">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag så har jag gjort en fork och en pull request mot Martas app.<br />
Det jag har ändrat/implementerat i hennes app är följand:</p>
<blockquote><p>
Tagit bort &#8221;överlödiga&#8221; jquery selectorer och lagt dess i create direkt istället.</p>
<p>&#8216;artistAdded&#8217;-eventet har jag ändrat eftersom du inte behöver en artistModel där, eller du använder den inte i vilket fall.</p>
<p>Ändrat sättet du skickar in din artistCollection till newArtist-vyn. Efterosm du endast hanterar en collection i denna vy så är det rekommenderat att använda { collection : this.artistCollection } i denna istället för att behöva skapa en egen definerad variabel.
</p></blockquote>
<p>Hela pull requesten kan ses <a href="https://github.com/martajohnsson/ria/pull/1">här</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-03-kollaborering-marta/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Todo &#8211; RIA</title>
		<link>http://dzemo.se/ria/todo-ria</link>
		<comments>http://dzemo.se/ria/todo-ria#comments</comments>
		<pubDate>Mon, 05 Mar 2012 22:41:53 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[Projekt]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Webbutveckling]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=259</guid>
		<description><![CDATA[Nu är min RIA (Rich internet application) färdigställd (i alla fall inom ramarna för kursen) och då tänkte jag skriva några rader kring projekt och kursen överlag. Applikationen finns att se här, och källkoden finns här. Innehåll: Planering Implementation Backbone &#8230; <a href="http://dzemo.se/ria/todo-ria">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nu är min RIA (Rich internet application) färdigställd (i alla fall inom ramarna för kursen) och då tänkte jag skriva några rader kring projekt och kursen överlag. Applikationen finns att se <a href="https://github.com/DzemalBecirevic/Ria">här</a>, och <a href="https://github.com/DzemalBecirevic">källkoden finns här</a>.</p>
<h2>Innehåll:</h2>
<ol>
<li><a href="#planering">Planering</a></li>
<li><a href="#implementation">Implementation</a></li>
<ul>
<li><a href="#bb">Backbone &#038; Underscore</a></li>
<li><a href="#events">Events – It’s tricky.. sometimes</a></li>
</ul>
<li><a href="#localStorage">localStorage</a></li>
<li><a href="#kollab">Kollaborering</a></li>
<li><a href="#slutsats">slutsats</a></li>
</ol>
<p>Anledningen till att jag valde att göra en &#8221;simpel&#8221; Todo applikation är för att det kändes som det enklaste sättet att lära sig ett nytt ramverk. Man får lära sig arbeta med vyer, events, CRUD och får en grundläggande förståelse för hur Backbone fungerar.</p>
<h2><a name="planering">Planering</a></h2>
<p>Planeringsstadiet i kursen kändes som ett bra moment, man fick tänka igenom alla objekt och funktioner innan man ens hade börjat koda någonting. Det är faktiskt väldigt ovanligt för mig som webbutvecklare som inte riktigt varit med i skarpa projekt och därför skippar planeringsstadiet i varje &#8221;privat&#8221; projekt men jag ser klart fördelen med att göra detta och jag ska försöka bättra mig på den fronten.</p>
<h2><a name="implementation">Implementation</a></h2>
<p>Nästa steg var att börja implementera min planerade applikation. Det var här problemen, självklart, började dyka upp. Först upplevde jag en hel del problem med att förstå hur require.js fungerar men att ha läst igenom <a href="http://backbonetutorials.com/organizing-backbone-using-modules/">Organizing your application using Modules (require.js)</a> så klarnade det hela väldigt mycket faktiskt.</p>
<h3><a name="bb">Backbone &#038; Underscore</a></h3>
<p>Nu gällde det bara att förstå sig på Backbone i sig, så där fick jag även spendera några timmar med att läsa på och testa olika implementationer för att få en bättre förståelse. Implementationen gick vidare och jag fick väldigt konstiga och kluriga buggar som både jag och David fick sitta och försöka lösa väldigt länge men felsökning är alltid roligt, i rimliga mått.</p>
<h3><a name="events">Events &#8211; It&#8217;s tricky.. sometimes</a></h3>
<p>Det klurigaste, men även det smidigast när förståelsen var på plats, var helt klart events och hur man ska jobba med dessa. Det finns t.ex flera olika lösningar för att ta bort en modell som man klickat på, men vad är det smidigaste sättet? Jag valde att implementera en vy för varje enskild Todo som gjorde att jag kunde koppla ett klick event till det elementet som i sin tur gjorde att jag bara kunde köra this.model.destroy();</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">delete</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">model</span>.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2><a name="localStorage">localStorage</a></h2>
<p>Jag använde mig utav localStorage som lagring för den här applikationen men har de senaste dagarna även hittat en, i brist på annan kunskap, lösning för att koppla på MongoDB som lagring genom att lägga en url-egenskap på modellen/collectionen som sedan går via ett php script för att hämta data från en MongoDB databas. Denna funktionalitet är inte implementerad i min applikationen utan testad för &#8221;utbildningssyfte&#8221;. Eventuell vidare utveckling av applikationen är att implementera en lösning för att applikationen ska använda MongoDB för att spara data externt och när användaren är online, men samtidigt använda localStorage på varje enskild klient för att kunna köra applikationen offline med.</p>
<h2><a name="kollab">Kollaborering</a></h2>
<p>Jag har ännu inte hunnit göra så mycket i kollaboreringsstadiet förutom det jag nämner i föregående inlägg &#8211; <a href="http://dzemo.se/ria/steg-03-kollaborering-pollthingy">kollaborering – pollthingy</a>, vilket var väldigt enkelt att implementera. Sen var det inte heller några större svårigheter att använda github för kollaboreringen, det fungerade väldigt smidigt och har fått mig att inse kraften i github, faktiskt så pass att jag hellre kör det nu än någon annan versionhanterings lösning som t.ex Google Code genom SVN.</p>
<h2><a name="slutsats">Slutsats</a></h2>
<p>Ja, då var vi här.. Allt som allt så har hela projektet varit roligt att genomföra, klurigt, utmanande men samtidigt väldigt givande. Det känns skönt att ha fördjupat sig lite mer i ett javascript ramverk för att lära sig göra &#8221;riktiga&#8221; applikationer med det istället för att bara använda javascript för t.ex. valdering av formulär och lite snygga animeringar. Känns som att jag fick upp ögonen för javascript som ett programmeringsspråk ännu mer än tidigare, men det kommer nog aldrig riktigt ersätta kärleken för PHP eller ASP.NET.</p>
<p>Dock, så har jag faktiskt börjat skriva om mina senaste applikationer som t.ex <a href="http://dzemo.se/projekt/chatter">Chatter</a> i Backbone, men jag har ännu inte kommit speciellt långt i utvecklingen.</p>
<p>Summa summarum, Backbone, underscore, require kommer definitivt komma till användning i mina framtida applikationer.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/todo-ria/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 03 &#8211; kollaborering &#8211; pollthingy</title>
		<link>http://dzemo.se/ria/steg-03-kollaborering-pollthingy</link>
		<comments>http://dzemo.se/ria/steg-03-kollaborering-pollthingy#comments</comments>
		<pubDate>Sun, 04 Mar 2012 10:03:53 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=255</guid>
		<description><![CDATA[Idag har jag gjort en fork på Rickard Magnussons applikation, Pollthingy (Pollthingy @ Github), implementerat mina ändringar och skickat en pull request. Appen är en simpel men bra skriven Poll-app för att skapa egna polls. De ändringar jag har implementerat &#8230; <a href="http://dzemo.se/ria/steg-03-kollaborering-pollthingy">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag har jag gjort en fork på Rickard Magnussons applikation, Pollthingy (<a href="https://github.com/zupher/2DV407">Pollthingy @ Github</a>), implementerat mina ändringar och skickat en pull request.</p>
<p>Appen är en simpel men bra skriven Poll-app för att skapa egna polls.<br />
De ändringar jag har implementerat i applikationen är:</p>
<blockquote><p>
Added validation to the PollModel and the AnswerModel.<br />
Try-catch for validation on create view.<br />
Validation errors show in alert-boxes.<br />
Removed all cluttred conlogs across the application.<br />
Changed the add method to the application from this.collection.add => this.collection.create because .add did not run the validate method.
</p></blockquote>
<p><a href="https://github.com/zupher/2DV407/pull/1">Se pull request</a>.</p>
<p>Att utföra en fork var vädligt enkelt, smidigt och genialt! Sedan var det vara att skapa ett lokalt repo för fork:en och så var man igång, precis som vanligt.</p>
<p>Även en pull request var jätte enkel att göra, genom webbgränssnittet på github så var det bara att klicka på pull request på sitt egna repo (en fork skapar ett eget repo av det ursprungliga repot) och skriva lite kommentarer och skicka iväg requesten. Riktigt smidigt och jag ska lätt börjar använda github mer och mer för egna projekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-03-kollaborering-pollthingy/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>steg 02 &#8211; implementation &#8211; dag 9</title>
		<link>http://dzemo.se/ria/steg-02-implementation-dag-9</link>
		<comments>http://dzemo.se/ria/steg-02-implementation-dag-9#comments</comments>
		<pubDate>Wed, 29 Feb 2012 13:14:46 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=251</guid>
		<description><![CDATA[Idag har det hänt mycket i applikationen, känns det som i alla fall. Kom fram till att jag hade placerat relationerna lite fel mellan modellerna men det är nu löst. Relationerna från TaskModel har flyttats över till CategoryModel eftersom det &#8230; <a href="http://dzemo.se/ria/steg-02-implementation-dag-9">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag har det hänt mycket i applikationen, känns det som i alla fall. Kom fram till att jag hade placerat relationerna lite fel mellan modellerna men det är nu löst. Relationerna från TaskModel har flyttats över till CategoryModel eftersom det faktiskt är CategoryModel som har en många relation till TaskModel.</p>
<p>Har även gjort en hel del styling och färdigställt det mesta i applikationen. Det som är kvar är ett event som behöver triggas när en användare att markera en uppgift som completed, så behövs TaskCollection sorteras igen.</p>
<p>Inte så mycket kod att visa idag känner jag. Har även passat på och skriva dokumentationen för applikationen, som finns <a href="https://github.com/DzemalBecirevic/Ria">här</a>, har även skrivit dit lite tips på framtida vidareutveckling inför nästa (läs nuvarande) steg i kursen.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-02-implementation-dag-9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>steg 02 &#8211; implementation &#8211; dag 8</title>
		<link>http://dzemo.se/ria/steg-02-implementation-dag-8</link>
		<comments>http://dzemo.se/ria/steg-02-implementation-dag-8#comments</comments>
		<pubDate>Tue, 28 Feb 2012 14:14:26 +0000</pubDate>
		<dc:creator>Dzemal</dc:creator>
				<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://dzemo.se/?p=248</guid>
		<description><![CDATA[Yes! Nu har jag i flera dagar försökt fixa ett problem! Problemet i sig var att efter att en task har lagts till, så ska vyn renderas om och jag testade att binda events på alla vyer jag har för &#8230; <a href="http://dzemo.se/ria/steg-02-implementation-dag-8">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yes! Nu har jag i flera dagar försökt fixa ett problem!<br />
Problemet i sig var att efter att en task har lagts till, så ska vyn renderas om och jag testade att binda events på alla vyer jag har för att åstadkomma detta. Och efter många frustrerande timmar med add, change bla bla bla events så valde jag att i categroycollectionview.js att sätta detta event:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">collection</span>.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'all'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">render</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Denna lösningen hittade jag efter lite sökande på nätet, jag har dock stött på den tidigare men inte velat använda den eftersom den faktiskt inte specificerar vilket typ av event och därför har jag sett det som &#8221;fulkod&#8221;. Men nu får det fungerar som en nödlösning eftersom inget annat jag testat har fungerat.</p>
<p>Har även implementerat ett sätt att visualisera en todo som är Done. Detta enkelt genom att ett change event triggas på todon och ändrar helt enkelt css attributet background.</p>
]]></content:encoded>
			<wfw:commentRss>http://dzemo.se/ria/steg-02-implementation-dag-8/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

