<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Web Development is Easy!]]></title>
  <link href="http://webdeveasy.com/atom.xml" rel="self"/>
  <link href="http://webdeveasy.com/"/>
  <updated>2014-11-06T10:35:58+02:00</updated>
  <id>http://webdeveasy.com/</id>
  <author>
    <name><![CDATA[NaorYe]]></name>
    <email><![CDATA[mailto:naorye@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[JavaScript Promises and AngularJS $q Service]]></title>
    <link href="http://webdeveasy.com/javascript-promises-and-angularjs-q-service/"/>
    <updated>2014-09-30T12:42:02+03:00</updated>
    <id>http://webdeveasy.com/javascript-promises-and-angularjs-q-service</id>
    <content type="html"><![CDATA[<p>A promise (deferred) is a very simple and powerful tool for asynchronous development. The CommonJS wiki lists <a href="http://wiki.commonjs.org/wiki/Promises" target="_blank">several implementation proposals for the promise pattern</a>. AngularJS has it&#8217;s own promise implementation that was inspired by <a href="https://github.com/kriskowal/q" target="_blank">Kris Kowal&#8217;s Q</a> implementation. In this article I&#8217;ll introduce promises, it&#8217;s motivation and provide a useful tutorial about working with promises using AngularJS $q promise service.</p>

<!-- more -->


<h2>Promise (Deferred) Motivation</h2>

<p>In JavaScript, asynchronous methods usually use callbacks in order to inform a success or a failure state. The Geolocation api, for example, requires success and failure callbacks in order to <a href="https://developer.mozilla.org/en-US/docs/Web/API/Geolocation.getCurrentPosition" target="_blank">get the current position</a>:</p>

<figure class='code'><figcaption><span>Use callbacks in Geolocation api</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">success</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">coords</span> <span class="o">=</span> <span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Your current position is &#39;</span> <span class="o">+</span> <span class="nx">coords</span><span class="p">.</span><span class="nx">latitude</span> <span class="o">+</span> <span class="s1">&#39; X &#39;</span> <span class="o">+</span> <span class="nx">coords</span><span class="p">.</span><span class="nx">longitude</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">error</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">warn</span><span class="p">(</span><span class="s1">&#39;ERROR(&#39;</span> <span class="o">+</span> <span class="nx">err</span><span class="p">.</span><span class="nx">code</span> <span class="o">+</span> <span class="s1">&#39;): &#39;</span> <span class="o">+</span> <span class="nx">err</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span><span class="nx">success</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another example is XMLHttpRequest (<a href="https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest" target="_blank">used to perform ajax calls</a>). It has <code>onreadystatechange</code> callback property that is called whenever the <code>readyState</code> attribute changes:</p>

<figure class='code'><figcaption><span>Callback use in XHR</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">xhr</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">window</span><span class="p">.</span><span class="nx">XMLHttpRequest</span><span class="p">();</span>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="s1">&#39;http://www.webdeveasy.com&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">onreadystatechange</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">===</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">status</span> <span class="o">===</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Success&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">send</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are many other examples of asynchronicity in JavaScript. Working with callbacks gets complicated when there is a need to synchronize several asynchronous operations.</p>

<h3>Sequentially Executing (Pyramid Of Doom)</h3>

<p>Assume we have <code>N</code> asynchronous methods: <code>async1(success, failure)</code>, <code>async2(success, failure)</code>, &#8230;, <code>asyncN(success, failure)</code> and we want to execute them sequentially, one after another, upon success. Each method gets success and failure callbacks so the code will be:</p>

<figure class='code'><figcaption><span>execute asynchronous methods sequentially</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async1</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">async2</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">async3</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">async4</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="p">....</span>
</span><span class='line'>                    <span class="p">....</span>
</span><span class='line'>                        <span class="p">....</span>
</span><span class='line'>                           <span class="nx">asyncN</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">null</span><span class="p">);</span>
</span><span class='line'>                        <span class="p">....</span>
</span><span class='line'>                    <span class="p">....</span>
</span><span class='line'>                <span class="p">....</span>
</span><span class='line'>            <span class="p">},</span> <span class="kc">null</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span> <span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">null</span><span class="p">);</span>
</span><span class='line'><span class="p">},</span> <span class="kc">null</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here we get the famous <a href="http://javascriptjabber.com/001-jsj-asynchronous-programming/" target="_blank">callback pyramid of doom</a>. Although there are nicer ways to write this code (separate that waterfall into functions for example), this is really hard to read and maintain.</p>

<h3>Parallel Executing</h3>

<p>Assume we have <code>N</code> asynchronous methods: <code>async1(success, failure)</code>, <code>async2(success, failure)</code>, &#8230;, <code>asyncN(success, failure)</code> and we want to execute them parallely and alert a message <strong>at the end of all</strong>. Each method gets success and failure callbacks so the code will be:</p>

<figure class='code'><figcaption><span>execute asynchronous methods parallel</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">counter</span> <span class="o">=</span> <span class="nx">N</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">success</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">counter</span> <span class="o">--</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">counter</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;done!&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">async1</span><span class="p">(</span><span class="nx">success</span><span class="p">);</span>
</span><span class='line'><span class="nx">async2</span><span class="p">(</span><span class="nx">success</span><span class="p">);</span>
</span><span class='line'><span class="p">....</span>
</span><span class='line'><span class="p">....</span>
</span><span class='line'><span class="nx">asyncN</span><span class="p">(</span><span class="nx">success</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>We declared a counter with initial value equals to the total asynchronous methods to execute. When each method is done, we decrease the counter by one and check whether this was the last execution. This solution is not simple for implementation or maintain, especially when each asynchronous method passes a result value to <code>success()</code>. In such case we will have to keep the results of each execution.</p>

<p>In both examples, at the time of execution of an asynchronic operation, we had to specify how it will be handled using a success callback. In other words, when we use callbacks, the asynchronic operation needs a reference to its continuation, but this continuation might not be its business. This can lead to tightly coupled modules and services which makes it difficult when reusing or testing code.</p>

<h2>What are Promise and Deferred?</h2>

<p>A deferred represents the result of an asynchronic operation. It exposes an interface that can be used for signaling the state and the result of the operation it represents. It also provides a way to get the associated promise instance. <br/>
A promise provides an interface for interacting with it&#8217;s related deferred, and so, allows for interested parties to get access to the state and the result of the deferred operation. <br/>
When creating a deferred, it&#8217;s state is <code>pending</code> and it doesn&#8217;t have any result. When we <code>resolve()</code> or <code>reject()</code> the deferred, it changes it&#8217;s state to <code>resolved</code> or <code>rejected</code>. Still, we can get the associated promise immediately after creating a deferred and even assign interactions with it&#8217;s future result. Those interactions will occur only after the deferred rejected or resolved.</p>

<p>When it comes to coupling, by using promises we can easily create an asynchronic operation before even decide what&#8217;s going to happen after the resolve. This is why coupling is looser. An asynchronic operation doesn&#8217;t have to know how it continues, it only has to signal when it is ready.</p>

<p>While deferred has methods for changing the state of an operation, a promise exposes only methods needed to handle and figure out the state, but not methods that can change the state. This is why in a function, returning a promise and not a deferred is a good practice. This prevents from external code to interfere the progress or the state of an operation.</p>

<p>There are several implementations of promises in different languages (JavaScript, JAVA, C++, Python and more) and frameworks (NodeJS, jQuery for JavaScript). AngularJS has a promise implementation under the <code>$q</code> service.</p>

<h2>How to use Deferrers and Promises</h2>

<p>After understanding promises and their motivation, now is the time to see how to use Deferrers and Promises. As said before, there are several implementations of promises, and so, different implementations may have different ways of usage. This section will use <a href="https://docs.angularjs.org/api/ng/service/$q" target="_blank">the AngularJS implementation of promise</a> - the $q service. Still, if you use a different implementation of promises, don&#8217;t worry, most of the methods I&#8217;ll describe here are equal for all implementations and if not, there is always an equivalent method.</p>

<h3>Basic usage</h3>

<p>First things first, let&#8217;s create a deferred!</p>

<figure class='code'><figcaption><span>Creating a deferred</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">myFirstDeferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>As simple as can be, <code>myFirstDeferred</code> holds a deferred that can be resolved or rejected whenever an asynchronous operation is done. Assume we have an asynchronous method <code>async(success, failure)</code> that gets success and failure callbacks as parameters. When <code>async</code> is done, we want to resolve or reject <code>myFirstDeferred</code> with the result (value or error reason):</p>

<figure class='code'><figcaption><span>Resolve and reject a deferred</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">myFirstDeferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">errorReason</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">myFirstDeferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">errorReason</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since <code>$q</code>&#8217;s resolve and reject methods don&#8217;t depend on a context in order to work, we can simply write:</p>

<figure class='code'><figcaption><span>Resolve and reject a deferred</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async</span><span class="p">(</span><span class="nx">myFirstDeferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">myFirstDeferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Taking the promise out of <code>myFirstDeferred</code> and assigning operations upon success or failure is pretty easy:</p>

<figure class='code'><figcaption><span>Using the promise</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">myFirstPromise</span> <span class="o">=</span> <span class="nx">myFirstDeferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">myFirstPromise</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;My first promise succeeded&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;My first promise failed&#39;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Keep on mind that we can assign the success and failure operations right after creating the deferred (even before calling to <code>async()</code>) and that we can assign as many operations as we like:</p>

<figure class='code'><figcaption><span>Using the promise several times</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">anotherDeferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'><span class="nx">anotherDeferred</span><span class="p">.</span><span class="nx">promise</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;This success method was assigned BEFORE calling to async()&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;This failure method was assigned BEFORE calling to async()&#39;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">async</span><span class="p">(</span><span class="nx">anotherDeferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">anotherDeferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">anotherDeferred</span><span class="p">.</span><span class="nx">promise</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;This ANOTHER success method was assigned AFTER calling to async()&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;This ANOTHER failure method was assigned AFTER calling to async()&#39;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If <code>async()</code> successes, both success methods will occur. The same is for failure. <br/>
A good approach is to wrap asynchronous operations with a function that returns a promise. This way the caller will be able to assign success and failure callbacks the way he likes, but will not be able to interfere the deferred state:</p>

<figure class='code'><figcaption><span>Wrap asynchronous operation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">getData</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">async</span><span class="p">(</span><span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="p">...</span> <span class="c1">// Later, in a different file</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">dataPromise</span> <span class="o">=</span> <span class="nx">getData</span><span class="p">()</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="p">...</span> <span class="c1">// Much later, at the bottom of that file :)</span>
</span><span class='line'><span class="nx">dataPromise</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Success!&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Failure...&#39;</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Up to here, when we used promises, we assigned both success and failure callbacks. But, there is also a way to assign only success or only failure functions:</p>

<figure class='code'><figcaption><span>Assign only success or failure callback to promise</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Assign only success callback to promise&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Assign only failure callback to promise&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// This is a shorthand for `promise.then(null, errorCallback)`</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Passing only success callback to <code>promise.then()</code> will assign only success callback and using <code>promise.catch()</code> will assign only failure callback. <code>catch()</code> is actually a shorthand for <code>promise.then(null, errorCallback)</code>. <br/>
In case we want to perform the same operation both on fulfillment or rejection of a promise, we can use <code>promise.finally()</code>:</p>

<figure class='code'><figcaption><span>Using finally</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="k">finally</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Assign a function that will be invoked both upon success and failure&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is equivalent to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">callback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Assign a function that will be invoked both upon success and failure&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Chaining values and promises</h3>

<p>Assume we have an asynchronous function <code>async()</code> that returns a promise. I have this interesting block of code:</p>

<figure class='code'><figcaption><span>values chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">promise1</span> <span class="o">=</span> <span class="nx">async</span><span class="p">();</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">promise2</span> <span class="o">=</span> <span class="nx">promise1</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">x</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can understand from that code, <code>promise1.then()</code> returns another promise, and I named it <code>promise2</code>. When <code>promise1</code> is resolved with a value <code>x</code>, the success callback executes and returns <code>x+1</code>. At this point <code>promise2</code> is resolved with <code>x+1</code>. <br/>
Another similar example:</p>

<figure class='code'><figcaption><span>values chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">promise2</span> <span class="o">=</span> <span class="nx">async</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">...</span> <span class="c1">// Do something with data</span>
</span><span class='line'>    <span class="c1">// Returns nothing!</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, when the promise that returned from <code>async()</code> is resolved, the success callback does it&#8217;s job and then <code>promise2</code> is resolved with no data (<code>undefined</code>). <br/>
As you can see, <strong><em>promises can chain values and are always resolved after the callback occurs with the returned value</em></strong>. <br/>
In order to demonstrate it, here is a silly example that uses promises (there is no really a need to use promises here):</p>

<figure class='code'><figcaption><span>values chaining example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Let&#39;s imagine this is really an asynchronous function</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">async</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">asyncCalculation</span> <span class="o">=</span> <span class="nx">value</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">asyncCalculation</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">x</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">x</span><span class="o">*</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">x</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This promises chain starts with calling to <code>async(8)</code> which fulfills the promise with the value <code>4</code>. This value passes through all the success callbacks and so the value <code>9</code> is logged (<code>(8 / 2 + 1) * 2 - 1</code>).</p>

<p>What happens if we chain another promise (and not a value)? Assume we have two asynchronous functions, <code>async1()</code> and <code>async2()</code>, each returns a promise. Let&#8217;s see the following:</p>

<figure class='code'><figcaption><span>promises chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async1</span><span class="p">()</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Assume async2() needs the response of async1() in order to work</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">async2Promise</span> <span class="o">=</span> <span class="nx">async2</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">async2Promise</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, unlike the previous example, the success callback performs another asynchronous operation and returns a promise. The value returned from <code>async1().then()</code> is a promise as expected, but now it can be resolved or rejected according to <code>async2Promise</code> and with it&#8217;s resolve value or reject reason. <br/>
Since <code>async2()</code> gets <code>data</code> as a parameter which is the value that <code>async1()</code> is resolved with, and since <code>async2()</code> returns a promise, we can simply write:</p>

<figure class='code'><figcaption><span>promises chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async1</span><span class="p">()</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">async2</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is another demonstration (again, the usage of promises in <code>async1()</code> and <code>async2()</code> is not mandatory and for demonstration purposes only):</p>

<figure class='code'><figcaption><span>promises chaining example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Let&#39;s imagine those are really asynchronous functions</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">async1</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">asyncCalculation</span> <span class="o">=</span> <span class="nx">value</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">asyncCalculation</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">async2</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">asyncCalculation</span> <span class="o">=</span> <span class="nx">value</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">asyncCalculation</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async1</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">async2</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, we call <code>async1(10)</code> which fulfills the promise and resolves it with the value <code>20</code>. Then the success callback is executed and <code>async2(20)</code> returns a promise that is fulfilled with the value <code>21</code>. Therefore <code>promise</code> is resolved with the value <code>21</code> and this is what logged. <br/>
A nice thing is that I can write the same example but with more readable code:</p>

<figure class='code'><figcaption><span>promises chaining - readable</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">logValue</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">async1</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">async2</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">logValue</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is easy to see that first we call to <code>async1()</code>, then we call to <code>async2()</code> and at the end we call to <code>logValue()</code>. Each method gets the previous resolved value as a parameter. Naming functions with proper names will also make it easy to understand. <br/>
All the previous examples with promises chaining were pretty optimistic since they all succeeded. But in case a promise is rejected for any reason, the chained promise will also be rejected:</p>

<figure class='code'><figcaption><span>promises chaining example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Let&#39;s imagine those are really asynchronous functions</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">async1</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">asyncCalculation</span> <span class="o">=</span> <span class="nx">value</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">asyncCalculation</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">async2</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;rejected for demonstration!&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async1</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">async2</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span> <span class="p">},</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">reason</span><span class="p">)</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Error: &#39;</span> <span class="o">+</span> <span class="nx">reason</span><span class="p">);</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can understand from this example, <code>Error: rejected for demonstration!</code> will be logged eventually.
<strong><em>Promises can chain promises and are resolved or rejected according to the chained promise (with the chained promise resolve value or reject reason)</em></strong>.  <br/>
Here is a more advanced example of promises chaining:</p>

<figure class='code'><figcaption><span>promises chaining advanced example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async1</span><span class="p">()</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">async2</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">async3</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">handleReject</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="k">finally</span><span class="p">(</span><span class="nx">freeResources</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example we invoked <code>async1()</code>, <code>async2()</code> and <code>async3()</code> one after another, synchronously. In case of any rejection in any one of those methods, the success invocation will stop and <code>handleReject()</code> will occur. At the end, <code>freeResources()</code> will occur no matter of success and failure. For instance, if <code>async2()</code> will return a rejected promise, <code>async3()</code> will not occur and <code>handleReject()</code> will be invoked with the rejection reason of <code>async2()</code>. And at the end <code>freeResources()</code> will occur.</p>

<h3>Useful methods</h3>

<p><code>$q</code> has several helper methods that can be a great help when using promises. As I said before, other promises implementations have the same methods, probably with a different name.</p>

<p>Sometimes we need to return a rejected promise. Instead of creating a new promise and rejecting it, we can use <a href="https://docs.angularjs.org/api/ng/service/$q#reject" target="_blank">$q.reject(reason)</a>. <code>$q.reject(reason)</code> returns a rejected promise with a reason. Example:</p>

<figure class='code'><figcaption><span>$q.reject(reason) example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">async</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">isSatisfied</span><span class="p">(</span><span class="nx">value</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;value is not satisfied&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">reason</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">canRecovered</span><span class="p">(</span><span class="nx">reason</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">newPromiseOrValue</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">reason</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If <code>async()</code> is resolved with a satisfied value, the value is chained and thus <code>promise</code> will be resolved with it. If the value is not satisfied, a rejected promise is chained and <code>promise</code> will be rejected.
If <code>async()</code> is rejected with a reason that can be recovered, a new value or promise will be chained. If the reason cannot be recovered, a rejected promise is chained and eventually <code>promise</code> will be rejected.</p>

<p>Similar to <code>$q.reject(reason)</code>, sometimes we need to return a resolved promise with a value. Instead of creating a new promise and resolving it, we can use <a href="https://docs.angularjs.org/api/ng/service/$q#when" target="_blank">$q.when(value)</a>.</p>

<figure class='code'><figcaption><span>using $q.when(value)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">getDataFromBackend</span><span class="p">(</span><span class="nx">query</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nx">searchInCache</span><span class="p">(</span><span class="nx">query</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">when</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">makeAsyncBackendCall</span><span class="p">(</span><span class="nx">query</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example I wrote a function that should retrieve a data from my backend. But, before performing the backend call, the function searches the data in the cache. Since I want this function to always return a promise, in case the data is found in the cache, the function returns <code>$q.when(data)</code>. <br/>
A cool thing with <code>$q.when(value)</code> is that if <code>value</code> is a 3rd party thenable promise (like jQuery&#8217;s Deferred), this method can wrap it and convert it into a $q promise. This way we can easily use other promises implementations with AngularJS. <br/>
<code>$.ajax()</code> of jQuery, for example, returns such thenable promise. The following converts it into angular $q promise:</p>

<figure class='code'><figcaption><span>using $q.when(jQueryPromise)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">jQueryPromise</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">angularPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">when</span><span class="p">(</span><span class="nx">jQueryPromise</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sometimes we need to perform several asynchronous operations, no matter the order, and to be notified when they all done. <a href="https://docs.angularjs.org/api/ng/service/$q#all" target="_blank">$q.all(promisesArr)</a> can help us with that. Assume we have <code>N</code> methods that return promises: <code>async1(), ..., asyncN()</code>. The following code will log <code>done</code> only when all operations are resolved successfully:</p>

<figure class='code'><figcaption><span>$q.all(promisesArr) example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">allPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span>
</span><span class='line'>    <span class="nx">async1</span><span class="p">(),</span>
</span><span class='line'>    <span class="nx">async2</span><span class="p">(),</span>
</span><span class='line'>    <span class="p">....</span>
</span><span class='line'>    <span class="p">....</span>
</span><span class='line'>    <span class="nx">asyncN</span><span class="p">()</span>
</span><span class='line'><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">allPromise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">value1</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">value2</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>        <span class="p">....</span>
</span><span class='line'>        <span class="p">....</span>
</span><span class='line'>        <span class="nx">valueN</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="nx">N</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;done&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>$q.all(promisesArr)</code> returns a promise that is resolved only when all the promises in <code>promisesArr</code> are resolved.
Keep in mind that if any of the promises is rejected, the resulting promise will be rejected as well.</p>

<p>Up to here we have learned how to create a deferred, how to reject and resolve it and how to get an access to it&#8217;s promise. We also seen some useful helping methods that can make our code cleaner and more readable. I think that now is the time for a practical tutorial.</p>

<h2>Promises tutorial using $q service</h2>

<p>Let&#8217;s say we have an amazing application with an amazing registration form. In order to register, a user has to supply his current geolocation coordinates, his photo and a username. To perform the registration action, our backend architecture requires the following from the frontend:</p>

<ol>
    <li>Provide geolocation longitude and latitude if possible</li>
    <li>Upload the user photo to our photos storage server and provide a url of it</li>
    <li>Reserve the username upon username selection and provide username reservation id</li>
</ol>


<p>For supporting that, let&#8217;s create the following simple functions (I decided to make this separation of functions in order to explain better). Look carefully and see that those methods are asynchronous and this is where promises come in:</p>

<h3>Function that retrieves the current geolocation coordinates</h3>

<figure class='code'><figcaption><span>getGeolocationCoordinates()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">getGeolocationCoordinates</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span>
</span><span class='line'>        <span class="kd">function</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">);</span> <span class="p">},</span>
</span><span class='line'>        <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>getGeolocationCoordinates()</code> declares a deferred and then asks the browser for the current position. Since the geolocation coordinates are not mandatory, both the success and failure callbacks that are provided to <code>navigator.geolocation.getCurrentPosition()</code> resolve the deferred with some result. In case of failure the result will be <code>null</code>. At the end, the deferred&#8217;s promise is returned.</p>

<h3>Function that reads a local file and returns it&#8217;s content</h3>

<figure class='code'><figcaption><span>readFile()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">readFile</span><span class="p">(</span><span class="nx">fileBlob</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FileReader</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">reader</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">reader</span><span class="p">.</span><span class="nx">result</span><span class="p">);</span> <span class="p">};</span>
</span><span class='line'>    <span class="nx">reader</span><span class="p">.</span><span class="nx">onerror</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">();</span> <span class="p">};</span>
</span><span class='line'>    <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">reader</span><span class="p">.</span><span class="nx">readAsDataURL</span><span class="p">(</span><span class="nx">fileBlob</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>readFile()</code> gets a file blob (the output of <code>&lt;input type="file"&gt;</code> field) and uses <a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader" target="_blank">FileReader</a> to read it&#8217;s content. Before reading the data and returning a promise, <code>readFile()</code> assigned <code>onload</code> and <code>onerror</code> callbacks that resolve and reject the deferred accordingly with the result. Notice that I decided to wrap <code>reader.readAsDataURL(fileBlob);</code> with <code>try {} catch() {}</code> block in order to handle run time exceptions. In case of an exception, the deferred is rejected.</p>

<h3>Function that gets file content and uploads it to files storage</h3>

<figure class='code'><figcaption><span>uploadFile()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">uploadFile</span><span class="p">(</span><span class="nx">fileData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">jQueryPromise</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;&lt;endpoint for our files storage upload action&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">data</span><span class="o">:</span> <span class="nx">fileData</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">when</span><span class="p">(</span><span class="nx">jQueryPromise</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since everyone knows jQuery, I decided to use <a href="#" target="_blank"><code>$.ajax()</code></a> in <code>uploadFile()</code>. <code>$.ajax()</code> returns a promise, which is actually what we need. But, this promise is a jQuery&#8217;s promise implementation and not <code>$q</code>. Fortunately, here we can use <code>$q.when(value)</code> method, so <code>uploadFile()</code> uses it and returns a promise.</p>

<h3>Function that reserves a username and returns the reservation id</h3>

<figure class='code'><figcaption><span>reserveUsername()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">reserveUsername</span><span class="p">(</span><span class="nx">username</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">$http</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;&lt;endpoint for username reservation action&gt;&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">username</span><span class="o">:</span> <span class="nx">username</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here I used <a href="#" target="_blank"><code>$http</code></a> service of AngularJS. <code>$http.post()</code> returns a promise which indicates the post status. This promise is created by <code>$q</code> service inside <code>$http.post()</code> and this will be the return value.</p>

<p>Now that we have all the methods needed for registration, let&#8217;s wrap them in a service called <code>appService</code> (you can see the complete <code>app-service.js</code> at the end of this tutorial).</p>

<h3>Application Controller</h3>

<p>Our application controller is pretty simple. It uses <code>$scope</code>, <code>$q</code> and <code>appCervice</code> which are injected in the controller definition. The controller also contains several methods for handling the data (at the end of this tutorial you can find the full source code of this controller).</p>

<h3>Longitude and Latitude</h3>

<p>I don&#8217;t want the user to be able to enter values for longitude and latitude, the only way to set values on those fields is by getting the geolocation from the device. Here is a markup of two input elements, they are both bound to model and have a readonly attribute.</p>

<figure class='code'><figcaption><span>longitude the latitude inputs</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div&gt;</span>
</span><span class='line'>    Longitude
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">readonly=</span><span class="s">&quot;readonly&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;coords.longitude&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;div&gt;</span>
</span><span class='line'>    Latitude
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">readonly=</span><span class="s">&quot;readonly&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;coords.latitude&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the controller, all we have to do is to call <code>getGeolocationCoordinates()</code> and set the coordinates data when we get the result:</p>

<figure class='code'><figcaption><span>handling geolocation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">appService</span><span class="p">.</span><span class="nx">getGeolocationCoordinates</span><span class="p">()</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setCoords</span><span class="p">(</span><span class="nx">coordsData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">coords</span> <span class="o">=</span> <span class="nx">coordsData</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>User name</h3>

<p>Here is the markup for user name input. I also added error support by showing the error message and adding an <code>error</code> class in case of an error. Whenever the username input changes, <code>$scope.reserveUsername()</code> is called.</p>

<figure class='code'><figcaption><span>user name input</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-class=</span><span class="s">&quot;{ error: usernameError }&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    User Name
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;username&quot;</span> <span class="na">ng-change=</span><span class="s">&quot;reserveUsername()&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">ng-bind=</span><span class="s">&quot;usernameError&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>$scope.reserveUsername()</code> should use <code>appService</code> to reserve the new username, set username reservation data upon success and set an error upon failure.</p>

<figure class='code'><figcaption><span>handling user name</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">reservationPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;No username reservation had made&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">$scope</span><span class="p">.</span><span class="nx">reserveUsername</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">newUsername</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">username</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">reservationPromise</span> <span class="o">=</span> <span class="nx">appService</span><span class="p">.</span><span class="nx">reserveUsername</span><span class="p">(</span><span class="nx">newUsername</span><span class="p">)</span>
</span><span class='line'>        <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setUsernameReservation</span><span class="p">(</span><span class="nx">reservation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$scope</span><span class="p">.</span><span class="nx">reservation</span> <span class="o">=</span> <span class="nx">reservation</span><span class="p">;</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>        <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setUsernameError</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$scope</span><span class="p">.</span><span class="nx">usernameError</span> <span class="o">=</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">usernameError</span><span class="p">);</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, <code>reservationPromise</code> is initialized with a rejected promise to handle a case where no reservation will be made. <br/>
When <code>$scope.reserveUsername()</code> happened, a backend reservation occurs. On success, <code>setUsernameReservation()</code> doesn&#8217;t return a promise and <code>reservationPromise</code> is resolved (values chaining causes the resulted promise to de resolved). On failure, <code>setUsernameError()</code> returns a rejected promise and so <code>reservationPromise</code> is rejected with an error message (promises chaining causes the resulted promise to be resolved or rejected according to the chained promise).</p>

<h3>User Photo</h3>

<p>The user photo field contains several components: the file input, a placeholder for the selected photo url, a placeholder for the selected image and a placeholder for an error message. I also used here a directive I wrote, named <code>filePathChanged</code>, that triggers a function whenever the user selects a file. You can see the code of the directive down this page.</p>

<figure class='code'><figcaption><span>user photo input</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-class=</span><span class="s">&quot;{ error: photoError }&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    Select Photo
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;file&quot;</span> <span class="na">file-path-changed=</span><span class="s">&quot;fileSelected(files)&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;photoError&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;span</span> <span class="na">ng-if=</span><span class="s">&quot;photoUrl&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;photoUrl&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;img</span> <span class="na">ng-if=</span><span class="s">&quot;photoData&quot;</span> <span class="na">ng-src=</span><span class="s">&quot;&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s see the implementation of <code>$scope.fileSelected(files)</code>.</p>

<figure class='code'><figcaption><span>handling user image</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">photoPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;No user photo selected&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">$scope</span><span class="p">.</span><span class="nx">fileSelected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">files</span> <span class="o">&amp;&amp;</span> <span class="nx">files</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">filePath</span> <span class="o">=</span> <span class="nx">files</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">photoPromise</span> <span class="o">=</span> <span class="nx">appService</span><span class="p">.</span><span class="nx">readFile</span><span class="p">(</span><span class="nx">filePath</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setPhotoData</span><span class="p">(</span><span class="nx">photoData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$scope</span><span class="p">.</span><span class="nx">photoData</span> <span class="o">=</span> <span class="nx">photoData</span><span class="p">;</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">photoData</span><span class="p">;</span>
</span><span class='line'>            <span class="p">})</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">appService</span><span class="p">.</span><span class="nx">uploadFile</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setPhotoUrl</span><span class="p">(</span><span class="nx">photoUrl</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$scope</span><span class="p">.</span><span class="nx">photoUrl</span> <span class="o">=</span> <span class="nx">photoUrl</span><span class="p">;</span>
</span><span class='line'>            <span class="p">})</span>
</span><span class='line'>            <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="kd">function</span> <span class="nx">setPhotoError</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$scope</span><span class="p">.</span><span class="nx">photoError</span> <span class="o">=</span> <span class="s1">&#39;An error has occurred: &#39;</span> <span class="o">+</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">photoError</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code is simple. First we verify that a file is supplied. Next we read the file using <code>appService.readFile()</code> and set the photo data in a model. Then we upload the file data, get a url for the photo and set the photo url in a model. In case of any error we set the error message in a model and chain rejected promise.</p>

<h3>Registration</h3>

<p>Our last step is the registration button. We have to create a function that collects the longitude and latitude, the selected photo url and the reservation id of the chosen username. In any case of an error with the username reservation or the photo handling, this function has to reflect an error message. Remember, the longitude and latitude are not mandatory so if they are not available at the time of the registration - it will not stop the process.</p>

<figure class='code'><figcaption><span>register() method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$scope</span><span class="p">.</span><span class="nx">register</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$q</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span>
</span><span class='line'>        <span class="nx">reservationPromise</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">photoPromise</span>
</span><span class='line'>    <span class="p">]).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="nx">doRegistrationCall</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">longitude</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span> <span class="o">&amp;&amp;</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">longitude</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">latitude</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span> <span class="o">&amp;&amp;</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">latitude</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">reservationId</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">reservation</span><span class="p">.</span><span class="nx">token</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">photoUrl</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">photoUrl</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">doRegistration</span><span class="p">(</span><span class="nx">longitude</span><span class="p">,</span> <span class="nx">latitude</span><span class="p">,</span> <span class="nx">reservationId</span><span class="p">,</span> <span class="nx">photoUrl</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span> <span class="nx">setSubmitError</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">submitError</span> <span class="o">=</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we used <code>$q.all()</code> because we want to perform an operation after username reservation and photo handling are both done. In case of any rejection we mark that the registration failed by assigning <code>submitError</code> model. In this example, <code>doRegistration()</code> is a method that does the registration call to the backend.</p>

<p>That&#8217;s all! our registration process is now complete. <br/>
Here is the full source of our small application.</p>

<h3>app-service.js</h3>

<figure class='code'><figcaption><span>app-service.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;appService&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;jquery&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nx">$http</span><span class="p">,</span> <span class="nx">$q</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">getGeolocationCoordinates</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span>
</span><span class='line'>            <span class="kd">function</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">);</span> <span class="p">},</span>
</span><span class='line'>            <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">readFile</span><span class="p">(</span><span class="nx">fileBlob</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">reader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FileReader</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">reader</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">reader</span><span class="p">.</span><span class="nx">result</span><span class="p">);</span> <span class="p">};</span>
</span><span class='line'>        <span class="nx">reader</span><span class="p">.</span><span class="nx">onerror</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">();</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">reader</span><span class="p">.</span><span class="nx">readAsDataURL</span><span class="p">(</span><span class="nx">fileBlob</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">uploadFile</span><span class="p">(</span><span class="nx">fileData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// var jQueryPromise = $.ajax({</span>
</span><span class='line'>        <span class="c1">//     method: &#39;POST&#39;,</span>
</span><span class='line'>        <span class="c1">//     url: &#39;&lt;endpoint for our files storage upload action&gt;&#39;,</span>
</span><span class='line'>        <span class="c1">//     data: fileData</span>
</span><span class='line'>        <span class="c1">// });</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="s1">&#39;www.myimage.com/123&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">jQueryPromise</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">when</span><span class="p">(</span><span class="nx">jQueryPromise</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reserveCount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">reserveUsername</span><span class="p">(</span><span class="nx">username</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// return $http.post(&#39;&lt;endpoint for username reservation action&gt;&#39;, {</span>
</span><span class='line'>        <span class="c1">//     username: username</span>
</span><span class='line'>        <span class="c1">// });</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">reserveCount</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">reserveCount</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;error reserving &quot;&#39;</span> <span class="o">+</span> <span class="nx">username</span> <span class="o">+</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">token</span> <span class="o">=</span> <span class="s1">&#39;token&#39;</span> <span class="o">+</span> <span class="nx">reserveCount</span><span class="p">;</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">({</span>
</span><span class='line'>                    <span class="nx">token</span><span class="o">:</span> <span class="nx">token</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">username</span><span class="o">:</span> <span class="nx">username</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="nx">reserveCount</span> <span class="o">++</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span> <span class="mi">300</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">getGeolocationCoordinates</span><span class="o">:</span> <span class="nx">getGeolocationCoordinates</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">readFile</span><span class="o">:</span> <span class="nx">readFile</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">uploadFile</span><span class="o">:</span> <span class="nx">uploadFile</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">reserveUsername</span><span class="o">:</span> <span class="nx">reserveUsername</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note: in order to mimic <code>uploadFile()</code> and <code>reserveUsername()</code> without implementing a backend, I&#8217;ve created a custom code that sometimes is resolved and sometimes is rejected. <br/>
Now we can proceed with the controller implementation.</p>

<h3>app-controller.js</h3>

<figure class='code'><figcaption><span>app-controller.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">module</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;appController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="s1">&#39;appService&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$q</span><span class="p">,</span> <span class="nx">appService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">errors</span><span class="o">:</span> <span class="p">{</span> <span class="p">}</span> <span class="p">};</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setCoords</span><span class="p">(</span><span class="nx">coordsData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span> <span class="o">=</span> <span class="nx">coordsData</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setPhotoData</span><span class="p">(</span><span class="nx">photoData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">photoData</span> <span class="o">=</span> <span class="nx">photoData</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setPhotoUrl</span><span class="p">(</span><span class="nx">photoUrl</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">photoUrl</span> <span class="o">=</span> <span class="nx">photoUrl</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">clearPhotoError</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">delete</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">photo</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setPhotoError</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">photo</span> <span class="o">=</span> <span class="s1">&#39;An error has occurred: &#39;</span> <span class="o">+</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">photo</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">clearUsernameError</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">delete</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">username</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setUsernameError</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">username</span> <span class="o">=</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">username</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setUsernameReservation</span><span class="p">(</span><span class="nx">reservation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">reservation</span> <span class="o">=</span> <span class="nx">reservation</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">setSubmitError</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">submit</span> <span class="o">=</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">clearSubmitError</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">delete</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">submit</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">doRegistration</span><span class="p">(</span><span class="nx">longitude</span><span class="p">,</span> <span class="nx">latitude</span><span class="p">,</span> <span class="nx">reservationId</span><span class="p">,</span> <span class="nx">photoUrl</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">success</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">storedJSON</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">longitude</span><span class="o">:</span> <span class="nx">longitude</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">latitude</span><span class="o">:</span> <span class="nx">latitude</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">reservationId</span><span class="o">:</span> <span class="nx">reservationId</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">photoUrl</span><span class="o">:</span> <span class="nx">photoUrl</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">appService</span><span class="p">.</span><span class="nx">getGeolocationCoordinates</span><span class="p">()</span>
</span><span class='line'>        <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">setCoords</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">photoPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;No user photo selected&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">fileSelected</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">files</span> <span class="o">&amp;&amp;</span> <span class="nx">files</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">filePath</span> <span class="o">=</span> <span class="nx">files</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">clearPhotoError</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">photoPromise</span> <span class="o">=</span> <span class="nx">appService</span><span class="p">.</span><span class="nx">readFile</span><span class="p">(</span><span class="nx">filePath</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">setPhotoData</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">appService</span><span class="p">.</span><span class="nx">uploadFile</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">setPhotoUrl</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">setPhotoError</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reservationPromise</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;No username reservation had made&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">reserveUsername</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">newUsername</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">username</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">clearUsernameError</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">reservationPromise</span> <span class="o">=</span> <span class="nx">appService</span><span class="p">.</span><span class="nx">reserveUsername</span><span class="p">(</span><span class="nx">newUsername</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">setUsernameReservation</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">setUsernameError</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">register</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$q</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span>
</span><span class='line'>            <span class="nx">reservationPromise</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">photoPromise</span>
</span><span class='line'>        <span class="p">]).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">longitude</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span> <span class="o">&amp;&amp;</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">longitude</span><span class="p">;</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">latitude</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span> <span class="o">&amp;&amp;</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">latitude</span><span class="p">;</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">reservationId</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">reservation</span><span class="p">.</span><span class="nx">token</span><span class="p">;</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">photoUrl</span> <span class="o">=</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">photoUrl</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">clearSubmitError</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">doRegistration</span><span class="p">(</span><span class="nx">longitude</span><span class="p">,</span> <span class="nx">latitude</span><span class="p">,</span> <span class="nx">reservationId</span><span class="p">,</span> <span class="nx">photoUrl</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">setSubmitError</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>index.html</h3>

<figure class='code'><figcaption><span>index.html</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">http-equiv=</span><span class="s">&quot;X-UA-Compatible&quot;</span> <span class="na">content=</span><span class="s">&quot;IE=edge&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;&lt;/title&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span> <span class="o">||</span> <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s1">&#39;&lt;script src=&quot;/scripts/libs/jquery.js&quot;&gt;&lt;\/script&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://ajax.googleapis.com/ajax/libs/angularjs/1.2.14/angular.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nb">window</span><span class="p">.</span><span class="nx">angular</span> <span class="o">||</span> <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s1">&#39;&lt;script src=&quot;/scripts/libs/angular.js&quot;&gt;&lt;\/script&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nt">&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;/style/semantic.css&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;/style/app.css&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body</span> <span class="na">ng-app=</span><span class="s">&quot;demo-app&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;form</span> <span class="na">class=</span><span class="s">&quot;ui form segment&quot;</span> <span class="na">ng-controller=</span><span class="s">&quot;appController&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;two fields&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;field&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;label</span> <span class="na">for=</span><span class="s">&quot;longitude&quot;</span><span class="nt">&gt;</span>Longitude<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>                <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;longitude&quot;</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">readonly=</span><span class="s">&quot;readonly&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;data.coords.longitude&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;No Longitude&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;field&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;label</span> <span class="na">for=</span><span class="s">&quot;latitude&quot;</span><span class="nt">&gt;</span>Latitude<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>                <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;latitude&quot;</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">readonly=</span><span class="s">&quot;readonly&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;data.coords.latitude&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;No Latitude&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;field username&quot;</span> <span class="na">ng-class=</span><span class="s">&quot;{ error: data.errors.username }&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;label</span> <span class="na">for=</span><span class="s">&quot;username&quot;</span><span class="nt">&gt;</span>User Name<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui labeled icon input&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;username&quot;</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;data.username&quot;</span> <span class="na">ng-change=</span><span class="s">&quot;reserveUsername()&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;User Name&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>                <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui red label pointing above&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;data.errors.username&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>                <span class="nt">&lt;i</span> <span class="na">class=</span><span class="s">&quot;circular ban circle icon&quot;</span><span class="nt">&gt;&lt;/i&gt;</span>
</span><span class='line'>                <span class="nt">&lt;i</span> <span class="na">class=</span><span class="s">&quot;circular checkmark icon&quot;</span> <span class="na">ng-if=</span><span class="s">&quot;data.reservation&quot;</span><span class="nt">&gt;&lt;/i&gt;</span>
</span><span class='line'>                <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui corner label&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                    <span class="nt">&lt;i</span> <span class="na">class=</span><span class="s">&quot;icon asterisk&quot;</span><span class="nt">&gt;&lt;/i&gt;</span>
</span><span class='line'>                <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;inline field user-photo&quot;</span> <span class="na">ng-class=</span><span class="s">&quot;{ error: data.errors.photo }&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;label</span> <span class="na">for=</span><span class="s">&quot;file&quot;</span> <span class="na">class=</span><span class="s">&quot;ui icon button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;i</span> <span class="na">class=</span><span class="s">&quot;file icon&quot;</span><span class="nt">&gt;&lt;/i&gt;</span>
</span><span class='line'>                Select Photo
</span><span class='line'>            <span class="nt">&lt;/label&gt;</span>
</span><span class='line'>            <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;file&quot;</span> <span class="na">id=</span><span class="s">&quot;file&quot;</span> <span class="na">file-path-changed=</span><span class="s">&quot;fileSelected(files)&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui red label&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;data.errors.photo&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui green label&quot;</span> <span class="na">ng-if=</span><span class="s">&quot;data.photoUrl&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;data.photoUrl&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui segment&quot;</span> <span class="na">ng-if=</span><span class="s">&quot;data.photoData&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;img</span> <span class="na">class=</span><span class="s">&quot;rounded ui image&quot;</span> <span class="na">ng-src=</span><span class="s">&quot;&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;field&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui blue submit button&quot;</span> <span class="na">ng-click=</span><span class="s">&quot;register()&quot;</span><span class="nt">&gt;</span>Register<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;field&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui red label&quot;</span> <span class="na">ng-if=</span><span class="s">&quot;data.errors.submit&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;data.errors.submit&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>            <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui green label&quot;</span> <span class="na">ng-if=</span><span class="s">&quot;data.success&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                Registration Seccess with ,
</span><span class='line'>                ,
</span><span class='line'>                username = , photo url = 
</span><span class='line'>            <span class="nt">&lt;/span&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;scripts/module.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;scripts/directives.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;scripts/app-service.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;scripts/app-controller.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here I used <a href="http://semantic-ui.com/" target="_blank">a nice CSS framework</a> named <i>Semantic UI</i> in order to produce a better looking UI. Therefore this markup contains many classes and other elements.</p>

<h3>directives.js</h3>

<p>We only have one directive named <code>filePathChanged</code>.</p>

<figure class='code'><figcaption><span>directives.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">module</span><span class="p">.</span><span class="nx">directive</span><span class="p">(</span><span class="s1">&#39;filePathChanged&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">restrict</span><span class="o">:</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">scope</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">filePathChanged</span><span class="o">:</span> <span class="s1">&#39;&amp;&#39;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">link</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">element</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">element</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">scope</span><span class="p">.</span><span class="nx">filePathChanged</span><span class="p">({</span> <span class="nx">files</span><span class="o">:</span> <span class="nx">element</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="s1">&#39;files&#39;</span><span class="p">)</span> <span class="p">});</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Summary</h2>

<p>After reading this article you should know by now that working with callbacks might make a hard life especially when synchronization is needed (parallel and sequentially executing). You were introduced with the deferrers and promises solution and saw how to use it. Through this article you saw explanations and examples of important promises methods and learned about promises chaining. At the end you got a practical tutorial. Here is a short list to summarize the methods mentioned in this article:</p>

<ul>
    <li><code>var deferred = $q.defer();</code> - creates a new deferred</li>
    <li><code>deferred.resolve(value);</code> - resolves a deferred with a value</li>
    <li><code>deferred.reject(reason);</code> - rejects a deferred with a reason</li>
    <li><code>var promise = deferred.promise;</code> - gets a promise from deferred</li>
    <li><code>promise.then(success, failure);</code> - assigns callbacks for success (resolve) and failure (reject)</li>
    <li><code>promise.catch(failure);</code> - assigns failure callback (equals to <code>promise.then(null, failure)</code>)</li>
    <li><code>promise.finally(always);</code> - assign a callback to be called both on success or failure</li>
    <li><code>var promise = $q.reject(reason);</code> - returns rejected promise with a reason</li>
    <li><code>var promise = $q.when(valueOrPromise);</code> - wraps value or other implementation of thenable promise with AngularJS promise</li>
    <li><code>var promise = $q.all(promisesArr);</code> - returns a promise that will be resolved only when all promises in `promisesArr` are resolved</li>
</ul>


<p>Here are three additional links:</p>

<ul>
    <li><a target="_blank" href="http://webdeveasy.com/code/javascript-promises-and-angularjs-q-service/index.html">The tutorial application in action</a></li>
    <li><a target="_blank" href="https://github.com/naorye/angulajs-q-service-tutorial">The tutorial source on GitHub</a></li>
    <li><a href="https://github.com/naorye/angulajs-q-service-tutorial/archive/master.zip">The tutorial source zip file</a></li>
</ul>


<p>I really hope you liked this article!
Good luck,
NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Back Button Behavior on a Page With an iframe]]></title>
    <link href="http://webdeveasy.com/back-button-behavior-on-a-page-with-an-iframe/"/>
    <updated>2014-05-29T01:45:45+03:00</updated>
    <id>http://webdeveasy.com/back-button-behavior-on-a-page-with-an-iframe</id>
    <content type="html"><![CDATA[<p>I am developing a widget for websites. This widget lays inside an iframe in a website&#8217;s page. One of my users (which is a site owner) complained about a weird behavior of my widget. On pages where the widget was implemented, the browser&#8217;s back button didn&#8217;t work properly. Instead of navigating the user to the previous page on the website, the back button navigated the user to the previous page inside the iframe.</p>

<!-- more -->


<p>Let me show you an example. This <a target="_blank" href="http://webdeveasy.com/code/back-button-behavior-on-a-page-with-an-iframe/problem/page1.html">demo page</a> includes two pages. The first page contains nothing but a link to the second page. When clicking on the link, we are redirected to the second page that contains an iframe. At this point, looking on the browser&#8217;s history will show us only the first page as expected:</p>

<p><img src="http://webdeveasy.com/code/back-button-behavior-on-a-page-with-an-iframe/problem/images/page2.png" /></p>

<p>In order to demonstrate navigation inside an iframe, the iframe in the second page contains a page with an anchor. This anchor refers to a different page. A click on the anchor causes navigation inside the iframe, but also adds a new history entry of the second page:</p>

<p><img src="http://webdeveasy.com/code/back-button-behavior-on-a-page-with-an-iframe/problem/images/iframe2.png" /></p>

<p>Pressing back will not return us back to the first page. Instead, it will change the iframe&#8217;s page and this is not the desired behavior. <br/>
What we really want is the iframe&#8217;s navigation not to interfere the browser&#8217;s navigation. Pressing the back button should take us back to the first page and not to the previous iframe&#8217;s page.</p>

<p><strong><em>It appears that any location change in the iframe is stored in the browser&#8217;s history.</em></strong></p>

<p>Once the problem is understood, the solution is pretty simple. Whenever the user navigates inside the iframe, we don&#8217;t want to add a new entry to the history. In order to do that, I&#8217;d like to explain a bit about anchors.</p>

<h2>How anchors work?</h2>

<p>When an anchor is clicked, it navigates to the new page and the new location is added to the browser&#8217;s hitory. But, if the url is the same as the current url, no history entry is added and the anchor only performs a page refresh. It is easy to verify what I am saying here by creating a page that contains a link to itself. Clicking on this anchor only refreshes the page and no history entry is added.</p>

<h2>history.replaceState() To The Rescue</h2>

<p>Luckily HTML5 gave us <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history" target="_blank">a great API for controlling the history</a>. <code>window.history</code> exposes useful methods that let us manipulate the contents of the history stack. Among these methods we can find the <code>replaceState()</code> method. <code>history.replaceState()</code> can modify the current history entry and associate it with the current document. <br/>
Assuming we have the following anchor inside an iframe&#8217;s page: <code>&lt;a href="iframe2.html"&gt;iframe page 2&lt;/a&gt;</code>. Clicking on it redirects us to <code>page2.html</code> and adds a new history entry for that page. If the current location, prior to the anchor&#8217;s action, is the same as the anchor&#8217;s url, then no new history entry will be added. <br/>
Let&#8217;s manipulate the history and set the current location to the anchor&#8217;s url before the anchor performs it&#8217;s action:</p>

<figure class='code'><figcaption><span>Prevent anchors to add history entry</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">anchors</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">);</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">anchors</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">anchor</span> <span class="o">=</span> <span class="nx">anchors</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</span><span class='line'>    <span class="nx">anchor</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">history</span><span class="p">.</span><span class="nx">replaceState</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">anchor</span><span class="p">.</span><span class="nx">href</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span> <span class="kc">false</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This script runs through all the page&#8217;s anchors and attaches a click event. Whenever the user clicks on an anchor, the current location is replaced with the anchor&#8217;s href. And here we prevented from another history entry to be added. <br/>
Keep in mind that this script has to run at the end of the page, after the DOM has loaded. <br/>
Here You can see the <a target="_blank" href="http://webdeveasy.com/code/back-button-behavior-on-a-page-with-an-iframe/solution/page1.html">solution</a>. Navigating inside the iframe doesn&#8217;t create history entry:</p>

<p><img src="http://webdeveasy.com/code/back-button-behavior-on-a-page-with-an-iframe/solution/images/iframe2.png" /></p>

<p>I spent a lot of time trying to understand the behavior of anchors and history and finding a solution for the back button issue. I hope you&#8217;ll find this explanation interesting and useful. <br/>
Thanks for reading,
NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interceptors in AngularJS and Useful Examples]]></title>
    <link href="http://webdeveasy.com/interceptors-in-angularjs-and-useful-examples/"/>
    <updated>2014-03-08T22:44:14+02:00</updated>
    <id>http://webdeveasy.com/interceptors-in-angularjs-and-useful-examples</id>
    <content type="html"><![CDATA[<p>The <code>$http</code> service of AngularJS allows us to communicate with a backend and make HTTP requests. There are cases where we want to capture every request and manipulate it before sending it to the server. Other times we would like to capture the response and process it before completing the call. Global http error handling can be also a good example of such need. Interceptors are created exactly for such cases. This article will introduce AngularJS interceptors and will provide some useful examples.</p>

<!-- more -->


<h2>What are Interceptors?</h2>

<p>The <code>$httpProvider</code> provider contains an array of interceptors. An interceptor is simply a regular service factory that is registered to that array. This is how we create an interceptor:</p>

<figure class='code'><figcaption><span>Interceptor declaration</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;myInterceptor&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$log&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$log</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$log</span><span class="p">.</span><span class="nx">debug</span><span class="p">(</span><span class="s1">&#39;$log is here to show you that this is a regular factory with injection&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">myInterceptor</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">....</span>
</span><span class='line'>        <span class="p">....</span>
</span><span class='line'>        <span class="p">....</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">myInterceptor</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And then add it by it&#8217;s name to <code>$httpProvider.interceptors</code> array:</p>

<figure class='code'><figcaption><span>add the interceptor to $httpProvider.interceptors</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$httpProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;myInterceptor&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Interceptors allow you to:</p>

<ul>
<li><p><strong>Intercept a request by implementing the <code>request</code> function:</strong> This method is called before <code>$http</code> sends the request to the backend, so you can modify the configurations and make other actions. This function receives the request configuration object as a parameter and has to return a configuration object or a promise. Returning an invalid configuration object or promise that will be rejected, will make the <code>$http</code> call to fail.</p></li>
<li><p><strong>Intercept a response by implementing the <code>response</code> function:</strong> This method is called right after <code>$http</code> receives the response from the backend, so you can modify the response and make other actions. This function receives a response object as a parameter and has to return a response object or a promise. The response object includes the request configuration, headers, status and data that returned from the backend. Returning an invalid response object or promise that will be rejected, will make the <code>$http</code> call to fail.</p></li>
<li><p><strong>Intercept request error by implementing the <code>requestError</code> function:</strong> Sometimes a request can&#8217;t be sent or it is rejected by an interceptor. Request error interceptor captures requests that have been canceled by a previous request interceptor. It can be used in order to recover the request and sometimes undo things that have been set up before a request, like removing overlays and loading indicators, enabling buttons and fields and so on.</p></li>
<li><p><strong>Intercept response error by implementing the <code>responseError</code> function:</strong> Sometimes our backend call fails. Other times it might be rejected by a request interceptor or by a previous response interceptor. In those cases, response error interceptor can help us to recover the backend call.</p></li>
</ul>


<h2>Asynchronous Operations</h2>

<p>Sometimes there is a need to make some asynchronous operations inside the interceptor. Luckily AngularJS allows us to return a promise that will be resolved later. This will defer the request sending in case of request interceptor and will defer the response resolving in case of response interceptor.</p>

<figure class='code'><figcaption><span>Make asynchronous operations in request interceptor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;myInterceptor&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="s1">&#39;someAsyncService&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$q</span><span class="p">,</span> <span class="nx">someAsyncService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">requestInterceptor</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">request</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">someAsyncService</span><span class="p">.</span><span class="nx">doAsyncOperation</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// Asynchronous operation succeeded, modify config accordingly</span>
</span><span class='line'>                <span class="p">...</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>
</span><span class='line'>            <span class="p">},</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// Asynchronous operation failed, modify config accordingly</span>
</span><span class='line'>                <span class="p">...</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">requestInterceptor</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example, the request interceptor makes an asynchronous operation and updates the config according to the results. Then it continues with the modified config. If <code>deferred</code> is rejected, the http request will fail. <br/>
The same applies for response interceptor:</p>

<figure class='code'><figcaption><span>Make asynchronous operations in response interceptor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;myInterceptor&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="s1">&#39;someAsyncService&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$q</span><span class="p">,</span> <span class="nx">someAsyncService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">responseInterceptor</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">response</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">someAsyncService</span><span class="p">.</span><span class="nx">doAsyncOperation</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// Asynchronous operation succeeded, modify response accordingly</span>
</span><span class='line'>                <span class="p">...</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
</span><span class='line'>            <span class="p">},</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// Asynchronous operation failed, modify response accordingly</span>
</span><span class='line'>                <span class="p">...</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">responseInterceptor</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Only when <code>deferred</code> is resolved, the request will succeed. If <code>deferred</code> is rejected, the request will fail.</p>

<h2>Examples</h2>

<p>In this section I&#8217;ll provide some examples to AngularJS Interceptors in order to give a good understanding of how to use them and how they can help you. Keep in mind that the solutions I provide here are not necessarily the best or the most accurate solutions.</p>

<h3>Session Injector (request interceptor)</h3>

<p>There are two ways of implementing server side authentication. The first one is to use the traditional Cookie-Based Authentication that uses server side cookies to authenticate the user on each request. The other approach is Token-Based Authentication. When the user logs in, he gets <code>sessionToken</code> from the backend. This <code>sessionToken</code> identifies the user in the server and is sent to the server on each request. <br/>
The following <code>sessionInjector</code> adds <code>x-session-token</code> header to each intercepted request (in case the current user is logged in):</p>

<figure class='code'><figcaption><span>Session Injector</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;sessionInjector&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;SessionService&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">SessionService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sessionInjector</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">request</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">SessionService</span><span class="p">.</span><span class="nx">isAnonymus</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">config</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s1">&#39;x-session-token&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">SessionService</span><span class="p">.</span><span class="nx">token</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">config</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">sessionInjector</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$httpProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;sessionInjector&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now creating a get request:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;https://api.github.com/users/naorye/repos&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The configuration object before intercepted by <code>sessionInjector</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;transformRequest&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="kc">null</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="s2">&quot;transformResponse&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="kc">null</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="s2">&quot;method&quot;</span><span class="o">:</span> <span class="s2">&quot;GET&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;url&quot;</span><span class="o">:</span> <span class="s2">&quot;https://api.github.com/users/naorye/repos&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;headers&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s2">&quot;Accept&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json, text/plain, */*&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The configuration object after intercepted by <code>sessionInjector</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;transformRequest&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="kc">null</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="s2">&quot;transformResponse&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="kc">null</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="s2">&quot;method&quot;</span><span class="o">:</span> <span class="s2">&quot;GET&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;url&quot;</span><span class="o">:</span> <span class="s2">&quot;https://api.github.com/users/naorye/repos&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;headers&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s2">&quot;Accept&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json, text/plain, */*&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="s2">&quot;x-session-token&quot;</span><span class="o">:</span> <span class="mi">415954427904</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Timestamp Marker (request and response interceptors)</h3>

<p>Let&#8217;s measure the time it takes to get a backend response using interceptors. It is done by adding a timestamp for each request and response:</p>

<figure class='code'><figcaption><span>Timestamp Marker</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;timestampMarker&#39;</span><span class="p">,</span> <span class="p">[</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">timestampMarker</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">request</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">config</span><span class="p">.</span><span class="nx">requestTimestamp</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">();</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">config</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">response</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">response</span><span class="p">.</span><span class="nx">config</span><span class="p">.</span><span class="nx">responseTimestamp</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">();</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">response</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">timestampMarker</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$httpProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;timestampMarker&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now we can do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;https://api.github.com/users/naorye/repos&#39;</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">time</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">config</span><span class="p">.</span><span class="nx">responseTimestamp</span> <span class="o">-</span> <span class="nx">response</span><span class="p">.</span><span class="nx">config</span><span class="p">.</span><span class="nx">requestTimestamp</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;The request took &#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">time</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; seconds.&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here you can find an <a href="http://webdeveasy.com/code/interceptors-in-angularjs-and-useful-examples/timestamp-marker.html" target="_blank">example for the Timestamp Marker</a>.</p>

<h3>Request Recover (request error interceptor)</h3>

<p>In order to demonstrate a request error interceptor we have to simulate a situation where a previous interceptor rejects the request. Our request error interceptor will get the rejection reason and will recover the request. <br/>
Let&#8217;s create two interceptors: <code>requestRejector</code> and <code>requestRecoverer</code>.</p>

<figure class='code'><figcaption><span>Request Recoverer</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;requestRejector&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$q</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">requestRejector</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">request</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="s1">&#39;requestRejector&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">requestRejector</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;requestRecoverer&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$q</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">requestRecoverer</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">requestError</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">rejectReason</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">rejectReason</span> <span class="o">===</span> <span class="s1">&#39;requestRejector&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// Recover the request</span>
</span><span class='line'>                <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">transformRequest</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>                    <span class="nx">transformResponse</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>                    <span class="nx">method</span><span class="o">:</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;https://api.github.com/users/naorye/repos&#39;</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                        <span class="nx">Accept</span><span class="o">:</span> <span class="s1">&#39;application/json, text/plain, */*&#39;</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">rejectReason</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">requestRecoverer</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$httpProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;requestRejector&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// Removing &#39;requestRecoverer&#39; will result to failed request</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;requestRecoverer&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now, if we do the following, we will get the log <code>success</code> even though <code>requestRejector</code> rejected the request:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;https://api.github.com/users/naorye/repos&#39;</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;success&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">rejectReason</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;failure&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here you can find an <a href="http://webdeveasy.com/code/interceptors-in-angularjs-and-useful-examples/request-recover.html" target="_blank">example for the Request Recover</a>.</p>

<h3>Session Recoverer (response error interceptor)</h3>

<p>There are times, in our single page application, where the session gets lost. Such situation might happen due to session expiration or a server error. Let&#8217;s create an interceptor that will recover the session and resend the original request again automatically (for situations where the session expired). <br/>
For the example purposes, let&#8217;s assume that the http status code for session expiration is 419.</p>

<figure class='code'><figcaption><span>Session Recoverer</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;sessionRecoverer&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="s1">&#39;$injector&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$q</span><span class="p">,</span> <span class="nx">$injector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sessionRecoverer</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">responseError</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// Session has expired</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span> <span class="o">==</span> <span class="mi">419</span><span class="p">){</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">SessionService</span> <span class="o">=</span> <span class="nx">$injector</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;SessionService&#39;</span><span class="p">);</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">$http</span> <span class="o">=</span> <span class="nx">$injector</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;$http&#39;</span><span class="p">);</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Create a new session (recover the session)</span>
</span><span class='line'>                <span class="c1">// We use login method that logs the user in using the current credentials and</span>
</span><span class='line'>                <span class="c1">// returns a promise</span>
</span><span class='line'>                <span class="nx">SessionService</span><span class="p">.</span><span class="nx">login</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// When the session recovered, make the same backend call again and chain the request</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">return</span> <span class="nx">$http</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">config</span><span class="p">);</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">sessionRecoverer</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$httpProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">interceptors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;sessionRecoverer&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way, whenever a backend call fails due to session expiration, <code>sessionRecoverer</code> creates a new session and performs the backend call again.</p>

<h2>Summary</h2>

<p>In this article I explained about AngularJS interceptors. I presented <code>request</code>, <code>response</code>, <code>requestError</code> and <code>responseError</code> interceptors and described how and when to use them. I also provided real world useful examples that can help you in your development.</p>

<p>I hope you enjoyed reading this article as much as I enjoyed writing it! <br/>
Good Luck! <br/>
NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Service Providers in AngularJS and Logger Implementation]]></title>
    <link href="http://webdeveasy.com/service-providers-in-angularjs-and-logger-implementation/"/>
    <updated>2014-02-08T16:49:33+02:00</updated>
    <id>http://webdeveasy.com/service-providers-in-angularjs-and-logger-implementation</id>
    <content type="html"><![CDATA[<p>In this article I&#8217;ll explain what a provider is and what is the difference between a provider and other services declaration in AngularJS. Through this article I&#8217;ll also create a tidy Logger for your AngularJS application.</p>

<!-- more -->


<h2>What is wrong with $log?</h2>

<p>Nothing! Really, $log is doing it&#8217;s work. It is a simple service for logging, including a default implementation that writes messages into the browser&#8217;s console. And that&#8217;s it. But when talking about logging, I&#8217;d like a service that will print my messages nicely, something like a timestamp and maybe a hint about where the message was created. I would also like to turn off all the messages during application configuration when running on production, and maybe expose a way to turn it on. I know $logProvider has the <code>debugEnabled(flag)</code> method, but I would like to turn off all the other kinds of messages (like <code>info()</code> and <code>error()</code>) and not only debug. Later on I may want to add colors to my messages and maybe aggregate all the <code>error()</code> messages and send them somehow to me. This is why I was looking to create a new logging mechanism. <br/>
While thinking about a way of implementation, I considered using a <a href="http://docs.angularjs.org/api/AUTO.$provide#decorator" target="_blank">service decorator</a> but then realized that I might want more than modifying the behavior of $log, like add or remove methods, or change the way $log&#8217;s methods work. Eventually I decided to use a <a href="http://docs.angularjs.org/api/AUTO.$provide#methods_provider" target="_blank">service provider</a>.</p>

<h2>A little about AngularJS services</h2>

<p>This section might be a little confusing, but it is really important to understand. When we call <code>module.provider()</code>, we are actually calling the <code>provider()</code> method of the <code>$provide</code> service. <code>$provide.provider()</code> is exposed on <code>angular.Module</code>. The same is for <code>module.service()</code> and <code>module.factory()</code>, they are methods of <code>$provide</code> service that are exposed on <code>angular.Module</code>. Therefore the following blocks are the same thing:</p>

<figure class='code'><figcaption><span>Calling directly to module.provider(), module.service() and module.factory()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;providerName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">service</span><span class="p">(</span><span class="s1">&#39;serviceName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;factoryName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>Calling directly to module.provider(), module.service() and module.factory()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$provide&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$provide</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$provide</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;providerName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$provide&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$provide</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$provide</span><span class="p">.</span><span class="nx">service</span><span class="p">(</span><span class="s1">&#39;serviceName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;$provide&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$provide</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$provide</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;factoryName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>More than that, <code>$provide.service()</code> and <code>$provide.factory()</code> are actually an easy way to use <code>$provide.provider()</code>:</p>

<figure class='code'><figcaption><span>$provide.service() and $provide.factory() are actually $provide.provider()</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$provide</span><span class="p">.</span><span class="nx">service</span><span class="p">(</span><span class="s1">&#39;serviceName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;The Catcher in the Rye&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">author</span> <span class="o">=</span> <span class="s1">&#39;J. D. Salinger&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="c1">// Equals to</span>
</span><span class='line'><span class="nx">$provide</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;serviceName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">$get</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$injector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$injector</span><span class="p">.</span><span class="nx">instantiate</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;The Catcher in the Rye&#39;</span><span class="p">;</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">author</span> <span class="o">=</span> <span class="s1">&#39;J. D. Salinger&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$provide</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;factoryName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;The Catcher in the Rye&#39;</span><span class="p">,</span> <span class="nx">author</span><span class="o">:</span> <span class="s1">&#39;J. D. Salinger&#39;</span> <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="c1">// Equals to</span>
</span><span class='line'><span class="nx">$provide</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;serviceName&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">$get</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$injector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$injector</span><span class="p">.</span><span class="nx">invoke</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;The Catcher in the Rye&#39;</span><span class="p">,</span> <span class="nx">author</span><span class="o">:</span> <span class="s1">&#39;J. D. Salinger&#39;</span> <span class="p">};</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we all can see, AngularJS only knows service provider (<code>$provide.provider()</code>) and all other ways of creating services are derived.</p>

<h2>What service provider gives?</h2>

<p>Besides of creating the service, service provider allows to configure the service on <code>module.config()</code> block. Look on the following <code>appColor</code> example service that is defined by a service provider:</p>

<figure class='code'><figcaption><span>Sample `appColor` service provider</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$provide</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;appColor&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">color</span> <span class="o">=</span> <span class="s1">&#39;Green&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">setColor</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">newColor</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">color</span> <span class="o">=</span> <span class="nx">newColor</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">$get</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">color</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Whenever we ask from Angular to inject <code>appColor</code>, we get the <code>color</code> variable that returned from the <code>$get</code> method. But on <code>module.config()</code> blocks we can ask for <code>appColorProvider</code> which exposes the provider and all it&#8217;s methods and attributes. This let us configure the service before other code consumes it:</p>

<figure class='code'><figcaption><span>`appColor` configuration and usage</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;appColorProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">appColorProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">appColorProvider</span><span class="p">.</span><span class="nx">setColor</span><span class="p">(</span><span class="s1">&#39;Blue&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">run</span><span class="p">([</span><span class="s1">&#39;appColor&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">appColor</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Will log: &#39;Application color is Blue&#39;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Application color is &#39;</span> <span class="o">+</span> <span class="nx">appColor</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, service provider gave us access to the &#8220;provider&#8221; part, where we can set methods or variables and which can be accessed during configuration only. And this is what I was looking for when thinking about creating my Logger.</p>

<h2>Creating the Logger!</h2>

<p>I want to create a Logger service that will print my messages in the following formats (according to the supplied arguments):  <br/>
<code>&lt;timestamp&gt; - &lt;context&gt;::&lt;method name&gt;('&lt;message&gt;')</code>
<code>&lt;timestamp&gt; - &lt;context&gt;: &lt;message&gt;</code></p>

<p>Before integrating with Angular, let&#8217;s create a Logger class that uses $log. First we will create a Logger constructor and a static helper method that will create new instances of Logger.</p>

<figure class='code'><figcaption><span>Logger construction</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Logger</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">context</span> <span class="o">=</span> <span class="nx">context</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">getInstance</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="nx">context</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>
The constructor gets a context as a parameter. <br/>
I want it to be easy to interpolate variables into the message string. Therefore, let&#8217;s take Douglas Crockford&#8217;s <a href="http://javascript.crockford.com/remedial.html" target="_blank">supplant implementation</a> and put it as a helper in Logger:</p>

<figure class='code'><figcaption><span>supplant support</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">str</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">str</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span>
</span><span class='line'>            <span class="sr">/\{([^{}]*)\}/g</span><span class="p">,</span>
</span><span class='line'>            <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">r</span> <span class="o">=</span> <span class="nx">o</span><span class="p">[</span><span class="nx">b</span><span class="p">];</span>
</span><span class='line'>                <span class="k">return</span> <span class="k">typeof</span> <span class="nx">r</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span> <span class="o">||</span> <span class="k">typeof</span> <span class="nx">r</span> <span class="o">===</span> <span class="s1">&#39;number&#39;</span> <span class="o">?</span> <span class="nx">r</span> <span class="o">:</span> <span class="nx">a</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now it is easy to add a method that returns a formatted timestamp:</p>

<figure class='code'><figcaption><span>formatted timestamp on message</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">getFormattedTimestamp</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">date</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>   <span class="k">return</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="s1">&#39;{0}:{1}:{2}:{3}&#39;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>        <span class="nx">date</span><span class="p">.</span><span class="nx">getHours</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">date</span><span class="p">.</span><span class="nx">getMinutes</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">date</span><span class="p">.</span><span class="nx">getSeconds</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">date</span><span class="p">.</span><span class="nx">getMilliseconds</span><span class="p">()</span>
</span><span class='line'>    <span class="p">]);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that the last two methods are generic methods and you can take them out and put in your <code>utils</code> service for example. <br/>
Now we want to write a generic <code>_log()</code> method that gets the original method of <code>$log</code> (log, info, warn, debug or error) and uses it to print a message according to the given arguments. First I&#8217;ll show my implementation and then explain:</p>

<figure class='code'><figcaption><span>generic `_log()` method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Supports the following arguments: fnName (optional), message (mandatory), supplantData (optional)</span>
</span><span class='line'>    <span class="c1">// Length and types of arguments are checked in order to determine the usage</span>
</span><span class='line'>    <span class="nx">_log</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">originalFn</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">now</span>  <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">getFormattedTimestamp</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">());</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="nx">supplantData</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>        <span class="k">switch</span> <span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span><span class='line'>                <span class="nx">message</span> <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="s2">&quot;{0} - {1}: {2}&quot;</span><span class="p">,</span> <span class="p">[</span> <span class="nx">now</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">context</span><span class="p">,</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">]);</span>
</span><span class='line'>                <span class="k">break</span><span class="p">;</span>
</span><span class='line'>            <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span><span class='line'>                <span class="nx">supplantData</span> <span class="o">=</span> <span class="nx">args</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>                <span class="nx">message</span> <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="s2">&quot;{0} - {1}::{2}(\&#39;{3}\&#39;)&quot;</span><span class="p">,</span> <span class="p">[</span> <span class="nx">now</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">context</span><span class="p">,</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">]);</span>
</span><span class='line'>                <span class="k">break</span><span class="p">;</span>
</span><span class='line'>            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">===</span> <span class="s1">&#39;string&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">message</span> <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="s2">&quot;{0} - {1}::{2}(\&#39;{3}\&#39;)&quot;</span><span class="p">,</span> <span class="p">[</span> <span class="nx">now</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">context</span><span class="p">,</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">]);</span>
</span><span class='line'>                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">supplantData</span> <span class="o">=</span> <span class="nx">args</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>                    <span class="nx">message</span> <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="s2">&quot;{0} - {1}: {2}&quot;</span><span class="p">,</span> <span class="p">[</span> <span class="nx">now</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">context</span><span class="p">,</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">]);</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>                <span class="k">break</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">$log</span><span class="p">[</span><span class="nx">originalFn</span><span class="p">].</span><span class="nx">call</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">supplant</span><span class="p">(</span><span class="nx">message</span><span class="p">,</span> <span class="nx">supplantData</span><span class="p">));</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>_log()</code> method first gets the formatted current date. Then it checks for the arguments length and types and determines which output the user wants to print:</p>

<ol>
<li>If the user supplied one argument, then the argument must be the message itself and <code>_log()</code> will print: <code>&lt;timestamp&gt; - &lt;context&gt;: &lt;message&gt;</code></li>
<li>If the user supplied three arguments, then the first argument is a method name, the second is the message and the third is an object of variables to interpolate with the message. For this, <code>_log()</code> will print: <code>&lt;timestamp&gt; - &lt;context&gt;::&lt;method name&gt;('&lt;message&gt;')</code></li>
<li>If the user provided two arguments, we need to find out whether he supplied a method name or an interpolation object. In order to figure that out, we&#8217;ll check the type of the last argument. If it is a string, then it has to be the message itself while the first argument is the method name. Otherwise consider the first argument as the message and the second as array of interpolation variables. The output print will be according to this check.</li>
</ol>


<p>At the end, <code>_log()</code> calls the required method on $log with the interpolated message. <br/>
Now the last thing to do is to implement an overrides to <code>log()</code>, <code>info()</code>, <code>warn()</code>, <code>debug()</code> and <code>error()</code>:</p>

<figure class='code'><figcaption><span>implement $log overrides</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="nx">log</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_log</span><span class="p">(</span><span class="s1">&#39;log&#39;</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">info</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_log</span><span class="p">(</span><span class="s1">&#39;info&#39;</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">warn</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_log</span><span class="p">(</span><span class="s1">&#39;warn&#39;</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">debug</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_log</span><span class="p">(</span><span class="s1">&#39;debug&#39;</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_log</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally we have a Logger! This is how we can use it:</p>

<figure class='code'><figcaption><span>Logger usage example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">logger</span> <span class="o">=</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">getInstance</span><span class="p">(</span><span class="s1">&#39;Example&#39;</span><span class="p">);</span> <span class="c1">// Name of this file / class / module</span>
</span><span class='line'><span class="nx">logger</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;This is a log&#39;</span><span class="p">);</span> <span class="c1">// Logs: &quot;19:24:1:263 - Example: This is a log&quot;</span>
</span><span class='line'><span class="nx">logger</span><span class="p">.</span><span class="nx">warn</span><span class="p">(</span><span class="s1">&#39;warn&#39;</span><span class="p">,</span> <span class="s1">&#39;This is a warn&#39;</span><span class="p">);</span> <span class="c1">// Warns: &quot;19:24:1:263 - Example::warn(&#39;This is a warn&#39;)&quot;</span>
</span><span class='line'><span class="nx">logger</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s1">&#39;This is a {0} error! {1}&#39;</span><span class="p">,</span> <span class="p">[</span> <span class="s1">&#39;big&#39;</span><span class="p">,</span> <span class="s1">&#39;just kidding&#39;</span> <span class="p">]);</span> <span class="c1">// Shouts: &quot;19:24:1:263 - Example: This is a big error! just kidding&quot;</span>
</span><span class='line'><span class="nx">logger</span><span class="p">.</span><span class="nx">debug</span><span class="p">(</span><span class="s1">&#39;debug&#39;</span><span class="p">,</span> <span class="s1">&#39;This is a debug for line {0}&#39;</span><span class="p">,</span> <span class="p">[</span> <span class="mi">8</span> <span class="p">]);</span> <span class="c1">// Logs: &quot;19:24:1:263 - Example::debug(&#39;This is a debug for line 8&#39;)&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>
Now we can finally integrate our new Logger with AngularJS service provider!</p>

<h2>Back To AngularJS Service Provider</h2>

<p>I wanted to create Logger provider with the ability of disable all the logs. For that I&#8217;ve created a provider that wraps our Logger implementation and adds a method to LoggerProvider for enable or disable Logger:</p>

<figure class='code'><figcaption><span>Logger service provider</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">provider</span><span class="p">(</span><span class="s1">&#39;Logger&#39;</span><span class="p">,</span> <span class="p">[</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">isEnabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">enabled</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_isEnabled</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">isEnabled</span> <span class="o">=</span> <span class="o">!!</span><span class="nx">_isEnabled</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// $log injected as a dependency</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">$get</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;$log&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$log</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">Logger</span> <span class="o">=</span> <span class="p">...</span>
</span><span class='line'>        <span class="p">...</span> <span class="c1">// Logger implementation</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">Logger</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last thing left to do is to change the <code>_log()</code> to do nothing if <code>isEnabled</code> equals to false:</p>

<figure class='code'><figcaption><span>enable / disable `_log()`</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Logger</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">_log</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">originalFn</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">isEnabled</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="p">....</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, Logger is enabled by default. In order to turn it off we just need to do:</p>

<figure class='code'><figcaption><span>Turn off logger</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span><span class="s1">&#39;LoggerProvider&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">LoggerProvider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">LoggerProvider</span><span class="p">.</span><span class="nx">enabled</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thats all!</p>

<h2>Summary</h2>

<p>On this article I discussed the difference between AngularJS factory, service and provider. I showed the similarity and explained that service provider is a base method that all other ways of creating services are derived from. I also explained the options of service provider over other services and the most important thing, created a Logger provider with you!</p>

<p>Here you can find <a href="https://github.com/naorye/angular-ny-logger" target="_blank">Logger GitHub Repository</a> with the source code and a demo.</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[AngularJS Data Model]]></title>
    <link href="http://webdeveasy.com/angularjs-data-model/"/>
    <updated>2013-11-23T20:51:33+02:00</updated>
    <id>http://webdeveasy.com/angularjs-data-model</id>
    <content type="html"><![CDATA[<p>As we already know, AngularJS doesn&#8217;t come with an out of the box solution for data modeling. In the most abstract way, AngularJS lets us use JSON data as a model in the controller. As the time passed and my application grew, I realized that this modeling method isn&#8217;t powerful enough to fit my application&#8217;s needs. In this article I will present the way I dealt with data modeling in my AngularJS application.</p>

<!-- more -->


<h2>Defining a model for controller</h2>

<p>Let&#8217;s start with a simple example. I would like to display a book view. This is the controller:</p>

<figure class='code'><figcaption><span>BookController</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;BookController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Harry Potter&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">author</span><span class="o">:</span> <span class="s1">&#39;J. K. Rowling&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">stores</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>            <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Barnes &amp; Noble&#39;</span><span class="p">,</span> <span class="nx">quantity</span><span class="o">:</span> <span class="mi">3</span><span class="p">},</span>
</span><span class='line'>            <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Waterstones&#39;</span><span class="p">,</span> <span class="nx">quantity</span><span class="o">:</span> <span class="mi">2</span><span class="p">},</span>
</span><span class='line'>            <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Book Depository&#39;</span><span class="p">,</span> <span class="nx">quantity</span><span class="o">:</span> <span class="mi">5</span><span class="p">}</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This controller creates a model of book which can be later used in our template:</p>

<figure class='code'><figcaption><span>template for displaying a book</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-controller=</span><span class="s">&quot;BookController&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    Id: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;book.id&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Name:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.name&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Author: <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.author&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In case we would like to get the book data from a backend api, we can also use $http:</p>

<figure class='code'><figcaption><span>BookController with $http</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;BookController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">bookId</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span> <span class="o">=</span> <span class="nx">bookData</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that bookData is still a JSON object.
Later on we would like to do something with this data. For example, update the book, delete it or even do other operations that are not dealing with the backend, like generate a book image url according to requested size or determining whether the book is available. Those methods can be declared on our controller:</p>

<figure class='code'><figcaption><span>BookController with several book actions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;BookController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">bookId</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span> <span class="o">=</span> <span class="nx">bookData</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">deleteBook</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$http</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">updateBook</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$http</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">,</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">getBookImageUrl</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;our/image/service/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span> <span class="o">+</span> <span class="s1">&#39;/width/height&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">isAvailable</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span> <span class="o">||</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">store</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">store</span><span class="p">.</span><span class="nx">quantity</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And later in our template:</p>

<figure class='code'><figcaption><span>template for displaying a complete book</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-controller=</span><span class="s">&quot;BookController&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">ng-style=</span><span class="s">&quot;{ backgroundImage: &#39;url(&#39; + getBookImageUrl(100, 100) + &#39;)&#39; }&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>    Id: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;book.id&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Name:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.name&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Author: <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.author&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Is Available: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;isAvailable() ? &#39;Yes&#39; : &#39;No&#39; &quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">ng-click=</span><span class="s">&quot;deleteBook()&quot;</span><span class="nt">&gt;</span>Delete<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">ng-click=</span><span class="s">&quot;updateBook()&quot;</span><span class="nt">&gt;</span>Update<span class="nt">&lt;/button&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Sharing a model between controllers</h2>

<p>As long as the book&#8217;s structure and methods are relevant only to one controller, all is fine and our work here is done. But as the application grows, there might be other controllers that will deal with books. Those controllers will sometimes need to fetch a book, update it, delete it or get it&#8217;s image url or availability. Therefore we have to share the behaviors of a book between controllers. In order to do this we will use a factory that returns the book&#8217;s behavior. Before writing this factory, I would like to mention here that we could make the factory return an object that contains helper methods for book (i.e. functions that get a book JSON and do what asked), but I prefer to use <a>prototype</a> for constructing a Book class, which I believe is the right choice:</p>

<figure class='code'><figcaption><span>Book model service</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;Book&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">Book</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">setData</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="c1">// Some other initializations related to book</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">Book</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">setData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">angular</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">load</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">scope</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">scope</span><span class="p">.</span><span class="nx">setData</span><span class="p">(</span><span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="k">delete</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">update</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">getImageUrl</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;our/image/service/&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">id</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="nx">width</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="nx">height</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">isAvailable</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">store</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">store</span><span class="p">.</span><span class="nx">quantity</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">Book</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way all book&#8217;s behavior is encapsulated in Book service. Now, let&#8217;s use our shiny Book service in our BookController:</p>

<figure class='code'><figcaption><span>BookController that uses Book model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;BookController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;Book&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">Book</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Book</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the controller became very thin. It now creates a Book instance, assigns it to the scope and loads it from the backend. When the book will be loaded, it&#8217;s properties will be changed and so the template. Keep in mind that other controllers that interact with a book, simply inject the Book service. We have to change the template to use book&#8217;s methods as well:</p>

<figure class='code'><figcaption><span>template that uses book instance</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-controller=</span><span class="s">&quot;BookController&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">ng-style=</span><span class="s">&quot;{ backgroundImage: &#39;url(&#39; + book.getImageUrl(100, 100) + &#39;)&#39; }&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>    Id: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;book.id&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Name:<span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.name&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Author: <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;book.author&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Is Available: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;book.isAvailable() ? &#39;Yes&#39; : &#39;No&#39; &quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">ng-click=</span><span class="s">&quot;book.delete()&quot;</span><span class="nt">&gt;</span>Delete<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">ng-click=</span><span class="s">&quot;book.update()&quot;</span><span class="nt">&gt;</span>Update<span class="nt">&lt;/button&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Up to here we saw how to model a data, encapsulate all its methods in one class and share this class between controllers without code duplication.</p>

<h2>Model of the same book in several controllers</h2>

<p>So we have a book model definition and several controllers that work with books. After using this modeling architecture you will notice that there is a big problem.
Up to now we supported several controllers that do operations with books. But what will happen if two controllers will deal with the same book? <br/>
Assume that we have a section with a list of names of all our books and another section with an editable view of a book. We have two controllers, one for each section. The first controller loads the books list and the second controller loads a single book. Our user sees the second section, edit the name of the book and then presses on the &#8220;update&#8221; button. The update process will succeed and the book name will be changed. But in the books list section the user still sees the old name! What happened actually is that there were two different instances of the same book - one for the books list and one for the editable view. When the user edited the book&#8217;s name, he actually changed the name property of the book instance that was binded to the editable view. Whereas the book instance that was binded to the books list view didn&#8217;t changed. <br/>
The solution for this problem is to share the same books instances with any controller that needs them. This way both the books list controller and the editable view controller will hold the same book instance and whenever this instance is changed, the changes will be reflected in all the views. Translating words to actions, we have to create a booksManager service (the letter b is not capital because it is an object and not a Class) that will manage books instances pool and will be responsible for returning instances of books. If the required instance doesn&#8217;t exist in the pool, the service will create it. If the required instance already exists in the pool, the service will only return it. Keep in mind that all the functions that load instances of books will be defined eventually only in our booksManager service since it has to be the only component that provide books instances.</p>

<figure class='code'><figcaption><span>booksManager service</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;booksManager&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="s1">&#39;$q&#39;</span><span class="p">,</span> <span class="s1">&#39;Book&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$http</span><span class="p">,</span> <span class="nx">$q</span><span class="p">,</span> <span class="nx">Book</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">booksManager</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">_pool</span><span class="o">:</span> <span class="p">{},</span>
</span><span class='line'>        <span class="nx">_retrieveInstance</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookId</span><span class="p">,</span> <span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">instance</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_pool</span><span class="p">[</span><span class="nx">bookId</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">instance</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">instance</span><span class="p">.</span><span class="nx">setData</span><span class="p">(</span><span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Book</span><span class="p">(</span><span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">_pool</span><span class="p">[</span><span class="nx">bookId</span><span class="p">]</span> <span class="o">=</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">_search</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookId</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_pool</span><span class="p">[</span><span class="nx">bookId</span><span class="p">];</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">_load</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookId</span><span class="p">,</span> <span class="nx">deferred</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">scope</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="kd">var</span> <span class="nx">book</span> <span class="o">=</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">_retrieveInstance</span><span class="p">(</span><span class="nx">bookData</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>                    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">book</span><span class="p">);</span>
</span><span class='line'>                <span class="p">})</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">();</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="cm">/* Public Methods */</span>
</span><span class='line'>        <span class="cm">/* Use this function in order to get a book instance by it&#39;s id */</span>
</span><span class='line'>        <span class="nx">getBook</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookId</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">book</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_search</span><span class="p">(</span><span class="nx">bookId</span><span class="p">);</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">book</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">book</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">_load</span><span class="p">(</span><span class="nx">bookId</span><span class="p">,</span> <span class="nx">deferred</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="cm">/* Use this function in order to get instances of all the books */</span>
</span><span class='line'>        <span class="nx">loadAllBooks</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">scope</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="err">&#39;</span><span class="nx">ourserver</span><span class="o">/</span><span class="nx">books</span><span class="p">)</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">booksArray</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="kd">var</span> <span class="nx">books</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>                    <span class="nx">booksArray</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="kd">var</span> <span class="nx">book</span> <span class="o">=</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">_retrieveInstance</span><span class="p">(</span><span class="nx">bookData</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>                        <span class="nx">books</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">book</span><span class="p">);</span>
</span><span class='line'>                    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>                    <span class="nx">deferred</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">books</span><span class="p">);</span>
</span><span class='line'>                <span class="p">})</span>
</span><span class='line'>                <span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">deferred</span><span class="p">.</span><span class="nx">reject</span><span class="p">();</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="cm">/*  This function is useful when we got somehow the book data and we wish to store it or update the pool and get a book instance in return */</span>
</span><span class='line'>        <span class="nx">setBook</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">scope</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">book</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_search</span><span class="p">(</span><span class="nx">bookData</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">book</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">book</span><span class="p">.</span><span class="nx">setData</span><span class="p">(</span><span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">book</span> <span class="o">=</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">_retrieveInstance</span><span class="p">(</span><span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">book</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">booksManager</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our Book service is now without the load method:</p>

<figure class='code'><figcaption><span>Book model without the load method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;Book&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">Book</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">setData</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="c1">// Some other initializations related to book</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">Book</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">setData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bookData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">angular</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">bookData</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="k">delete</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">update</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="s1">&#39;ourserver/books/&#39;</span> <span class="o">+</span> <span class="nx">bookId</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">getImageUrl</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;our/image/service/&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">id</span> <span class="o">+</span> <span class="s1">&#39;/width/height&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">isAvailable</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">book</span><span class="p">.</span><span class="nx">stores</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">store</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">store</span><span class="p">.</span><span class="nx">quantity</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">Book</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our EditableBookController and BooksListController controllers looks like:</p>

<figure class='code'><figcaption><span>EditableBookController and BooksListController that uses booksManager</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;EditableBookController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;booksManager&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">booksManager</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">booksManager</span><span class="p">.</span><span class="nx">getBook</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">book</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$scope</span><span class="p">.</span><span class="nx">book</span> <span class="o">=</span> <span class="nx">book</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}])</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;BooksListController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;booksManager&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">booksManager</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">booksManager</span><span class="p">.</span><span class="nx">loadAllBooks</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">books</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$scope</span><span class="p">.</span><span class="nx">books</span> <span class="o">=</span> <span class="nx">books</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that the templates remain the same as they still use instances. Now the application will hold only one book instance with id equals to 1 and any change on it will be reflected on all views that use it.</p>

<h2>Summary</h2>

<p>On this article I suggested an architecture for modeling data in AngularJS. First, I presented the default model binding of AngularJS, then I showed how to encapsulate the model&#8217;s methods and operations so we can share it between different controllers, and finally I explained how to manage our models instances so all the changes will be reflected on all the application views.</p>

<p>I hope this article gave you ideas how to implement your data models. If you have any question, don&#8217;t hesitate to ask!</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flexbox Accordion]]></title>
    <link href="http://webdeveasy.com/flexbox-accordion/"/>
    <updated>2013-10-26T16:45:02+03:00</updated>
    <id>http://webdeveasy.com/flexbox-accordion</id>
    <content type="html"><![CDATA[<p>I have made a css accordion using flexbox and I like to share it. This is how it looks like:</p>

<div class="flexbox-accordion-container">
    <ul class="actions-list">
        <li class="action-item facebook">
            Facebook
        </li>
        <li class="action-item google">
            GooglePlus
        </li>
        <li class="action-item linkedin">
            LinkedIn
        </li>
        <li class="action-item picasa">
            Picasa
        </li>
        <li class="action-item twitter">
            Twitter
        </li>
        <li class="action-item wikipedia">
            Wikipedia
        </li>
    </ul>
</div>


<!-- more -->


<br/>


<p>The markup and the css are pretty simple. We have a list of items, where the list is flexbox container and each item is a flex element. After defining this, all left to do is to define sizes, colors and the styling of each item. <br/>
Here is the code:</p>

<figure class='code'><figcaption><span>Flexbox accordion markup</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;actions-list&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item facebook&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Facebook
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item google&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        GooglePlus
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item linkedin&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        LinkedIn
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item picasa&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Picasa
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item twitter&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Twitter
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;action-item wikipedia&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Wikipedia
</span><span class='line'>    <span class="nt">&lt;/li&gt;</span>
</span><span class='line'><span class="nt">&lt;/ul&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>Flexbox accordion css</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="c">/* Flex box define */</span>
</span><span class='line'><span class="nc">.actions-list</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</span><span class='line'>    <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="k">inline</span><span class="o">-</span><span class="n">flex</span><span class="p">;</span>
</span><span class='line'>    <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">inline</span><span class="o">-</span><span class="n">flex</span><span class="p">;</span>
</span><span class='line'>    <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="k">inline</span><span class="o">-</span><span class="n">flexbox</span><span class="p">;</span>
</span><span class='line'>    <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="o">-</span><span class="n">flex</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.actions-list</span> <span class="nc">.action-item</span> <span class="p">{</span>
</span><span class='line'>    <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">flex</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">flex</span><span class="o">:</span> <span class="m">1</span> <span class="m">1</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">flex</span><span class="o">:</span> <span class="m">1</span> <span class="m">1</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">flex</span><span class="o">:</span> <span class="m">1</span> <span class="m">1</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>    <span class="n">flex</span><span class="o">:</span> <span class="m">1</span> <span class="m">1</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">transition</span><span class="o">:</span> <span class="n">all</span> <span class="m">300</span><span class="n">ms</span> <span class="n">ease</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">transition</span><span class="o">:</span> <span class="n">all</span> <span class="m">300</span><span class="n">ms</span> <span class="n">ease</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">o</span><span class="o">-</span><span class="n">transition</span><span class="o">:</span> <span class="n">all</span> <span class="m">300</span><span class="n">ms</span> <span class="n">ease</span><span class="p">;</span>
</span><span class='line'>    <span class="n">transition</span><span class="o">:</span> <span class="n">all</span> <span class="m">300</span><span class="n">ms</span> <span class="n">ease</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</span><span class='line'>    <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">overflow</span><span class="o">:</span> <span class="k">hidden</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c">/* Design: widths, colors, borders, etc... */</span>
</span><span class='line'><span class="nc">.actions-list</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.actions-list</span> <span class="nc">.action-item</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">font-family</span><span class="o">:</span> <span class="n">Helvetica</span><span class="o">,</span> <span class="n">Arial</span><span class="o">,</span> <span class="k">sans-serif</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-weight</span><span class="o">:</span> <span class="k">lighter</span><span class="p">;</span>
</span><span class='line'>    <span class="k">cursor</span><span class="o">:</span> <span class="k">pointer</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-color</span><span class="o">:</span> <span class="m">#66bbcc</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border-left</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">2</span><span class="p">);</span>
</span><span class='line'>    <span class="k">color</span><span class="o">:</span> <span class="m">#000000</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding-left</span><span class="o">:</span> <span class="m">52px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-repeat</span><span class="o">:</span> <span class="k">no-repeat</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="m">10px</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">line-height</span><span class="o">:</span> <span class="m">52px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">52px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">max-width</span><span class="o">:</span> <span class="m">50px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.actions-list</span> <span class="nc">.action-item</span><span class="nd">:hover</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">max-width</span><span class="o">:</span> <span class="m">150px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-color</span><span class="o">:</span> <span class="m">#ff9966</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding-right</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.actions-list</span> <span class="nc">.action-item</span><span class="nd">:first-child</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.facebook</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/facebook.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.google</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/google.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.linkedin</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/linkedin.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.picasa</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/picasa.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.twitter</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/twitter.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.wikipedia</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(http://www.webdeveasy.com/code/assets/images/wikipedia.png)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I hope you will find a good use for it.</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Easy Select Plugin]]></title>
    <link href="http://webdeveasy.com/easy-select-plugin/"/>
    <updated>2013-10-07T20:12:43+03:00</updated>
    <id>http://webdeveasy.com/easy-select-plugin</id>
    <content type="html"><![CDATA[<p>One day I was asked to add a text input component with an ability to choose a value from fixed list. After searching the web, I found several jQuery plugins that was able to solve my needs and much more. But, those components required many dependencies and weighed so much for my simple need. So I decided to write my own plugin. Easy Select requires jQuery only and takes 3kb minified (before gzip):</p>

<div>
    Select a continent: <input class="continent-input" type="text" />
    <script>
        $(function() {
            $('.continent-input').easySelect({
                idKey: 'value',
                textKey: 'name',
                items: [
                    { name: 'Africa', value: 1},
                    { name: 'Antarctica', value: 2},
                    { name: 'Asia', value: 3},
                    { name: 'Australia', value: 4},
                    { name: 'Europe', value: 5},
                    { name: 'North America', value: 6},
                    { name: 'South America', value: 7}
                ]
            });
        });
    </script>
</div>


<!-- more -->


<p>See a <a href="http://webdeveasy.com/code/easy-select-plugin/demo/index.html" target="_blank">demo</a>.</p>

<h2>Getting Started</h2>

<ol>
<li>Download the plugin from <a href="https://github.com/naorye/easy-select/archive/master.zip" target="_blank">here</a>.</li>
<li>Add a reference to jquery.easy-select.js and easy-select.css in your page (located in <code>/dist</code> folder). You can use the minified version instead by using jquery.easy-select.min.js and easy-select.min.css.</li>
<li>In order to use the plugin on text input element:</li>
</ol>


<figure class='code'><figcaption><span>Text input element</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">class=</span><span class="s">&quot;my-input&quot;</span> <span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>easy-select usage</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.my-input&#39;</span><span class="p">).</span><span class="nx">easySelect</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">items</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="mi">1</span><span class="o">:</span> <span class="s1">&#39;Option 1&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="mi">2</span><span class="o">:</span> <span class="s1">&#39;Option 2&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="mi">3</span><span class="o">:</span> <span class="s1">&#39;Option 3&#39;</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Options</h2>

<p>Easy select has a few options:</p>

<h4 style="margin-bottom: 0;">items</h4>


<p>Type: Array of objects<br/>
Default: <code>[]</code> <br/>
Array of items for the select box.</p>

<h4 style="margin-bottom: 0;">idKey</h4>


<p>Type: String <br/>
Default: <code>id</code> <br/>
The name of the attribute that represents the item id.</p>

<h4 style="margin-bottom: 0;">textKey</h4>


<p>Type: String <br/>
Default: <code>text</code> <br/>
The name of the attribute that represents the item text.</p>

<h4 style="margin-bottom: 0;">onSelect</h4>


<p>Type: Function <br/>
Default: <code>null</code> <br/>
A callback function that triggered every time a new item gets selected.</p>

<h2>Methods</h2>

<p>Easy select has also a few useful methods. In order to use them you need to access the API object:</p>

<figure class='code'><figcaption><span>Accessing easy-select API object</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.my-input&#39;</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;easySelect&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h4>getValue()</h4>

<p>In order to get the selectd text you can read the value of your text input. <code>getValue()</code> method returns the value (or id) of the selected item.</p>

<figure class='code'><figcaption><span>Usage example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.my-input&#39;</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;easySelect&#39;</span><span class="p">).</span><span class="nx">getValue</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h4>setItems()</h4>

<p><code>setItems()</code> method lets you change the items list during runtime. This method is useful when you want to load data asynchronously.</p>

<figure class='code'><figcaption><span>Usage example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;url/to/data&#39;</span><span class="p">).</span><span class="nx">done</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">items</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.my-input&#39;</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;easySelect&#39;</span><span class="p">).</span><span class="nx">setItems</span><span class="p">(</span><span class="nx">items</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>destroy()</h4>

<p><code>destroy()</code> method destroys the plugin by removing unnecessary elements and unbinding events.</p>

<figure class='code'><figcaption><span>Usage example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.my-input&#39;</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;easySelect&#39;</span><span class="p">).</span><span class="nx">destroy</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Contributing</h2>

<ol>
<li>Visit our git repository: <a href="https://github.com/naorye/easy-select" target="_blank">https://github.com/naorye/easy-select</a></li>
<li>Fork it!</li>
<li>Create your feature branch: <code>git checkout -b my-new-feature</code></li>
<li>Make your changes on the <code>src</code> folder, never on the <code>dist</code> folder</li>
<li>You can use <code>grunt build</code> and <code>grunt preview</code> commands in order to see your changes on the demo</li>
<li>Commit your changes: <code>git commit -m 'Add some feature'</code></li>
<li>Push to the branch: <code>git push origin my-new-feature</code></li>
<li>Submit a pull request</li>
</ol>


<p>I hope some of you will find a good use for it.</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Single Page Application Authentication]]></title>
    <link href="http://webdeveasy.com/single-page-application-authentication/"/>
    <updated>2013-09-25T23:27:44+03:00</updated>
    <id>http://webdeveasy.com/single-page-application-authentication</id>
    <content type="html"><![CDATA[<p>This article will guide you how to add user authentication to your single page application. On the back end side I will use Node.js and on the front end side I will use AngularJS. Although I used specific frameworks, you may apply the same technique for different back end and frond end frameworks (rails, Backbone, etc&#8230;). <br/>
The final application will look like this (without the horrible styling):<!--
--><iframe src="http://spa-auth.herokuapp.com/" width="580px" height="150px" scrolling="no" style="overflow:hidden;margin:0 45px;"></iframe></p>

<!-- more -->


<p>At the beginning of this article I will build an application based on <a target="_blank" href="http://nodejs.org">Node.js</a>, <a target="_blank" href="http://expressjs.com/">express</a>, <a target="_blank" href="http://mongoosejs.com/">mongoose</a> and <a target="_blank" href="http://angularjs.org/">AngularJS</a> and then I will add authentication support. At the end we will have single page application that allows users to login and logout from our system. For this article I chose to implement facebook authentication, but changing this later to other 3rd party or local authentication will be trivial. <br/>
One thing important to mention is that the final application will contain the minimum code required for this guide so don&#8217;t use it as a boilerplate code, the best thing is to learn from it and implement it yourself in your application.</p>

<h2>Create an application</h2>

<p>At the beginning, let&#8217;s create a single page application.</p>

<h3>Node.js server: app.js</h3>

<p>First thing we do is loading required modules:</p>

<figure class='code'><figcaption><span>Load required modules and configurations</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we connect to our mongo database (you should define your own) and load some mongoose models (right now we don&#8217;t have any model):</p>

<figure class='code'><figcaption><span>Connect to mongo db and load mongoose models</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">mongoose</span><span class="p">.</span><span class="nx">connect</span><span class="p">(</span><span class="s1">&#39;&lt;mongodb uri&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">models_path</span> <span class="o">=</span> <span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/app/models&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">fs</span><span class="p">.</span><span class="nx">readdirSync</span><span class="p">(</span><span class="nx">models_path</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">file</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span> <span class="o">===</span> <span class="s1">&#39;.js&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">require</span><span class="p">(</span><span class="nx">models_path</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="nx">file</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Last things to do is to configure express application, define its routes and start it. Express configurations and routes definitions are made in different files in order to keep the application easy to maintain.</p>

<figure class='code'><figcaption><span>Configure express, define routes and start</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/express&#39;</span><span class="p">)(</span><span class="nx">config</span><span class="p">);</span>
</span><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/routes&#39;</span><span class="p">)(</span><span class="nx">app</span><span class="p">,</span> <span class="nx">config</span><span class="p">);</span>
</span><span class='line'><span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="nx">app</span><span class="p">).</span><span class="nx">listen</span><span class="p">(</span><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;port&#39;</span><span class="p">),</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Express server listening on port &#39;</span> <span class="o">+</span> <span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;port&#39;</span><span class="p">));</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span> <span class="o">=</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">app</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Express configuration: config/express.js</h3>

<p>There is nothing special in this express configurations file. Amongst all the configurations, we:</p>

<ul>
<li>Set our views path to be /app/views</li>
<li>Set our view engine to <a target="_blank" href="https://github.com/visionmedia/ejs">ejs</a></li>
<li>Use <a target="_blank" href="http://kcbanner.github.io/connect-mongo/">connect-mongo</a> as a session store (you need to define your &lt;mongodb uri&gt;)</li>
<li>Define /public as a static folder (this folder will contain our front end application)</li>
</ul>


<figure class='code'><figcaption><span>express configurations</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">mongoStore</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;connect-mongo&#39;</span><span class="p">)(</span><span class="nx">express</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">root</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">normalize</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/..&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;showStackError&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;port&#39;</span><span class="p">,</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">3000</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">,</span> <span class="nx">root</span> <span class="o">+</span> <span class="s1">&#39;/app/views&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">,</span> <span class="s1">&#39;ejs&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">favicon</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">logger</span><span class="p">(</span><span class="s1">&#39;dev&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">bodyParser</span><span class="p">());</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">methodOverride</span><span class="p">());</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">cookieParser</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;my-session-store&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">store</span><span class="o">:</span> <span class="k">new</span> <span class="nx">mongoStore</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;&lt;mongodb uri&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">collection</span> <span class="o">:</span> <span class="s1">&#39;sessions&#39;</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>    <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">root</span> <span class="o">+</span> <span class="s1">&#39;/public&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">app</span><span class="p">.</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="s1">&#39;development&#39;</span> <span class="o">==</span> <span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;env&#39;</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="nx">errorHandler</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>             <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">);</span>
</span><span class='line'>             <span class="nx">next</span><span class="p">();</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">app</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Routes definition: config/routes.js</h3>

<p>Our routes definitions are very simple. We need to be able to serve secured data only for our members as well as unsecured data for all users. Therefore the router handles the following endpoints:</p>

<ul>
<li>GET request on api/secured/* for secured data</li>
<li>GET request on api/* for unsecured data</li>
<li>All other GET requests return the index view (except for static content that was defined on express configurations)</li>
</ul>


<figure class='code'><figcaption><span>Routes definition</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">app</span><span class="p">,</span> <span class="nx">passport</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;api/secured/*&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// Need to filter anonymous users somehow </span>
</span><span class='line'>            <span class="cm">/*if (not logged in) {</span>
</span><span class='line'><span class="cm">                return res.json({ error: &#39;This is a secret message, login to see it.&#39; });</span>
</span><span class='line'><span class="cm">            }*/</span>
</span><span class='line'>            <span class="nx">next</span><span class="p">();</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;This message is only for authenticated users&#39;</span> <span class="p">});</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;api/*&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;This message is known by all&#39;</span> <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/*&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that GET request on api/secured/* should return error JSON for anonymous users.</p>

<h3>Front end</h3>

<p>Our front end, which consists of AngularJS, has an html markup that contains a secured message and an unsecured message:</p>

<figure class='code'><figcaption><span>Markup</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">ng-controller=</span><span class="s">&quot;MessageController&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    Unsecured message: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;messages.unsecured&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br/&gt;</span>
</span><span class='line'>    Secured message: <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;messages.secured&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>At the end we would like the secured message to be displayed only to authenticated users.</p>

<p>This is our MessageController:</p>

<figure class='code'><figcaption><span>MessageController</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;MessageController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/api/secured/message&#39;</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">secured</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">error</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/api/message&#39;</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">unsecured</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">error</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can download the application we have so far, without authentication, <a target="_blank" href="../code/single-page-application-authentication/single-page-application-without-authentication.zip">here</a>. In order to run the application, fill in your &lt;mongodb uri&gt; in config/express.js, execute &#8216;npm install&#8217; and then execute &#8216;npm start&#8217;. <br/>
Now is the time to add authentication.</p>

<h2>Authentication support</h2>

<p>For supporting authentication, we will use <a target="_blank" href="http://passportjs.org/">Passport</a> which is a really simple authentication middleware for Node.js. There are other good authentication middlewares like <a target="_blank" href="http://everyauth.com/">everyauth</a> or <a target="_blank" href="https://github.com/ciaranj/connect-auth">connect-auth</a>, but I find Passport more modular and easy to use. <br/>
Supporting facebook authentication with Passport requires to add &#8220;passport&#8221; and &#8220;passport-facebook&#8221; packages to package.json.</p>

<p>Before I continue, I&#8217;d like to describe how the whole authentication process is going to be:</p>

<ol>
<li>The first time the user enters the application, he is not authenticated.</li>
<li>The user presses the &#8220;Login&#8221; button and a new window is opened. Because the authentication process includes redirection to facebook, I decided to open a new window in order to keep the current state of the application window.</li>
<li>This new window leads to an endpoint that triggers Passport and the authentication process begins.</li>
<li>During the authentication process, Passport redirects the user to facebook for authentication. When facebook authentication is completed, facebook redirects the user back to the application which will attempt to obtain an access token. If access was granted, the user will be logged in. Otherwise, authentication has failed.</li>
<li>If authentication succeeds, Passport creates a new user (or loads the user in case of returning user) and establishes a new session. This session will be maintained via a cookie set in the user&#8217;s browser.</li>
<li>After authentication is completed, Passport redirects the new window to an &#8220;after-auth&#8221; view that informs the parent opener window about the authentication state and the user data.</li>
<li>The next time the user enters to the application, the cookie will identify the session and the user will become logged in.</li>
</ol>


<p>Therefore, our to do list is:</p>

<ul>
<li>Create User model for representing users</li>
<li>Tell Passport how to create or load user instances according to facebook response</li>
<li>Create an after-auth view for completing the authentication</li>
<li>Create endpoints that triggers the authentication process and renders the after-auth view</li>
</ul>


<p>Now stop talking and let&#8217;s create the User mongoose model.</p>

<h3>User mongoose model</h3>

<figure class='code'><figcaption><span>User mongoose model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">Schema</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">UserSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">email</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">username</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">user_image</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">facebook_id</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">facebook</span><span class="o">:</span> <span class="p">{</span> <span class="p">},</span>
</span><span class='line'>    <span class="nx">createdAt</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Date</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="o">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;User&#39;</span><span class="p">,</span> <span class="nx">UserSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the User model is very simple. Except the usual user details, we also want to store the user&#8217;s facebook id and the whole JSON returned from facebook.</p>

<h3>Fetching the current user</h3>

<p>In order to be able to login using facebook, Passport requires an authentication mechanism (called Strategy). &#8220;passport-facebook&#8221; package gives us FacebookStrategy class which implements such mechanism. All we have to do is to tell Passport to use FacebookStrategy and implement a method that creates or loads a user according to facebook profile id. <br/>
(Note that in order to use this code, you have to supply your facebook app id and facebook app secret)</p>

<figure class='code'><figcaption><span>FacebookStrategy for Passport</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">FacebookStrategy</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">clientID</span><span class="o">:</span> <span class="s1">&#39;&lt;Your facebook app id&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">clientSecret</span><span class="o">:</span> <span class="s1">&#39;&lt;Your facebook app secret&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">callbackURL</span><span class="o">:</span> <span class="s1">&#39;/auth/facebook/callback&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">accessToken</span><span class="p">,</span> <span class="nx">refreshToken</span><span class="p">,</span> <span class="nx">profile</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="s1">&#39;facebook.id&#39;</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">id</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">({</span>
</span><span class='line'>                    <span class="nx">name</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">displayName</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">email</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">emails</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">value</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">username</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">provider_id</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">provider</span><span class="o">:</span> <span class="s1">&#39;facebook&#39;</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">facebook</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">_json</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>                <span class="nx">user</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>                    <span class="k">return</span> <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>When Passport gives us the user&#8217;s facebook profile, we perform mongodb search for the user according to his facebook profile id. If the user is not found, we create a new user model and save it. Eventually we return the user instance. <br/>
In addition to constructing the user from his facebook profile, we also have to tell Passport how to serialize and deserialize user instance to and from a session:</p>

<figure class='code'><figcaption><span>Serialize and deserialize user instance  </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">serializeUser</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">done</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">deserializeUser</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">_id</span><span class="o">:</span> <span class="nx">id</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When user is authenticated, passport serializes the user and stores the result in a session cookie. When a user with session cookie arrives to the system, Passport deserialize the user instance.</p>

<h3>After-authentication view</h3>

<p>After facebook approves or disapproves the user, Passport tries to obtain access token and renders after-auth view. This view contains a script that passes the login state along with the user data (in case of success login) to the parent window. This is done by defining an accessible method on the application window that knows to handle logins results. Let&#8217;s take a look on the after-auth view:</p>

<figure class='code'><figcaption><span>after-auth view</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Single Page Application Authentication - Auth Success<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">http-equiv=</span><span class="s">&quot;X-UA-Compatible&quot;</span> <span class="na">content=</span><span class="s">&quot;IE=edge,chrome=1&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">opener</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">window</span><span class="p">.</span><span class="nx">opener</span><span class="p">.</span><span class="nx">focus</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">state</span> <span class="o">=</span> <span class="s1">&#39;&lt;%= state %&gt;&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="o">&lt;%-</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="o">%&gt;</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">opener</span><span class="p">.</span><span class="nx">app</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>            <span class="nb">window</span><span class="p">.</span><span class="nx">opener</span><span class="p">.</span><span class="nx">app</span><span class="p">.</span><span class="nx">authState</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nb">window</span><span class="p">.</span><span class="nx">opener</span><span class="p">.</span><span class="nx">app</span><span class="p">.</span><span class="nx">authState</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nb">window</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, this view contains only script code that notifies the application about the authentication state and the user data. Later we will define the authState() method that handles the result. At the end, the pop-up window is closed.</p>

<p>Now is the time to connect all the actions. Let&#8217;s see our new endpoints.</p>

<h3>New routes definition</h3>

<p>First, let&#8217;s take a look on the endpoints that handles the login:</p>

<figure class='code'><figcaption><span>Login endpoints</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/facebook&#39;</span><span class="p">,</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;facebook&#39;</span><span class="p">));</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/facebook/callback&#39;</span><span class="p">,</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;facebook&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">successRedirect</span><span class="o">:</span> <span class="s1">&#39;/auth/success&#39;</span><span class="p">,</span> <span class="nx">failureRedirect</span><span class="o">:</span> <span class="s1">&#39;/auth/failure&#39;</span> <span class="p">}));</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/success&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;after-auth&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">state</span><span class="o">:</span> <span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="nx">user</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span> <span class="o">?</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span> <span class="o">:</span> <span class="kc">null</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/failure&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;after-auth&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">state</span><span class="o">:</span> <span class="s1">&#39;failure&#39;</span><span class="p">,</span> <span class="nx">user</span><span class="o">:</span> <span class="kc">null</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the user asks for /auth/facebook, Passport redirects the user to facebook which in turn redirects the user back to /auth/facebook/callback (accoring to FacebookStrategy implementation). Then, Passport tries to get access token and redirects to /auth/success or /auth/failure according to the result. <br/>
Both /auth/success and /auth/failure render our after-auth view with different parameters. <br/>
Another endpoint for logout will be DELETE request on /auth:</p>

<figure class='code'><figcaption><span>Logout endpoint</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s1">&#39;/auth&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">logout</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">writeHead</span><span class="p">(</span><span class="mi">200</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last thing to do is to fix our secured data endpoint:</p>

<figure class='code'><figcaption><span>Secured data endpoint</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/api/secured/*&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">error</span><span class="o">:</span> <span class="s1">&#39;This is a secret message, login to see it.&#39;</span> <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">next</span><span class="p">();</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;This message is only for authenticated users&#39;</span> <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we check whether req.user exists. In case it doesn&#8217;t, we return an error JSON.</p>

<p>After all our hard work, now is the time to see our authentication in action!</p>

<h2>Authentication in action</h2>

<p>In order to demonstrate our authentication implementation, we have to complete our front end application. Let&#8217;s create AngularJS service that will be responsible to the user session. The purposes of such service are:</p>

<ul>
<li>Initiate the authentication process</li>
<li>Allow logout</li>
<li>Supply handlers for authentication success / failure and maintain session state</li>
</ul>


<figure class='code'><figcaption><span>Session service</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s1">&#39;sessionService&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$rootScope&#39;</span><span class="p">,</span> <span class="s1">&#39;$window&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="kd">function</span> <span class="p">(</span><span class="nx">$rootScope</span><span class="p">,</span> <span class="nx">$window</span><span class="p">,</span> <span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">init</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">resetSession</span><span class="p">();</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">resetSession</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentUser</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">isLoggedIn</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">facebookLogin</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="s1">&#39;/auth/facebook&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">width</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">height</span> <span class="o">=</span> <span class="mi">650</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">top</span> <span class="o">=</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">outerHeight</span> <span class="o">-</span> <span class="nx">height</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">left</span> <span class="o">=</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">outerWidth</span> <span class="o">-</span> <span class="nx">width</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">$window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="s1">&#39;facebook_login&#39;</span><span class="p">,</span> <span class="s1">&#39;width=&#39;</span> <span class="o">+</span> <span class="nx">width</span> <span class="o">+</span> <span class="s1">&#39;,height=&#39;</span> <span class="o">+</span> <span class="nx">height</span> <span class="o">+</span> <span class="s1">&#39;,scrollbars=0,top=&#39;</span> <span class="o">+</span> <span class="nx">top</span> <span class="o">+</span> <span class="s1">&#39;,left=&#39;</span> <span class="o">+</span> <span class="nx">left</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">logout</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">scope</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="s1">&#39;/auth&#39;</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">scope</span><span class="p">.</span><span class="nx">resetSession</span><span class="p">();</span>
</span><span class='line'>                <span class="nx">$rootScope</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s1">&#39;session-changed&#39;</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">authSuccess</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">userData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentUser</span> <span class="o">=</span> <span class="nx">userData</span><span class="p">;</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">isLoggedIn</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>            <span class="nx">$rootScope</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s1">&#39;session-changed&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">authFailed</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">resetSession</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;Authentication failed&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">session</span><span class="p">.</span><span class="nx">init</span><span class="p">();</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">session</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Calling sessionService.facebookLogin() and sessionService.logout() will log us in and out from the application. sessionService.authSuccess() and sessionService.authFailed() are methods that get called whenever the application gets notified about the authentication state. From now on, whenever we like, we can use sessionService.isLoggedIn and sessionService.currentUser in order to know the authentication state and get the current logged in user. Our service also triggers a &#8216;session-changed&#8217; event each time the session changed.</p>

<p>Lt&#8217;s see now the changes in MessageController</p>

<figure class='code'><figcaption><span>MessageController</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;MessageController&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="s1">&#39;$rootScope&#39;</span><span class="p">,</span> <span class="s1">&#39;$http&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$rootScope</span><span class="p">,</span> <span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">function</span> <span class="nx">loadMessages</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/api/secured/message&#39;</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">secured</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">error</span><span class="p">;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/api/message&#39;</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$scope</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">unsecured</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">error</span><span class="p">;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">deregistration</span> <span class="o">=</span> <span class="nx">$rootScope</span><span class="p">.</span><span class="nx">$on</span><span class="p">(</span><span class="s1">&#39;session-changed&#39;</span><span class="p">,</span> <span class="nx">loadMessages</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">$scope</span><span class="p">.</span><span class="nx">$on</span><span class="p">(</span><span class="s1">&#39;$destroy&#39;</span><span class="p">,</span> <span class="nx">deregistration</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">loadMessages</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>MessageController basically remains the same, except that each time &#8216;session-changed&#8217; event is triggered, the controller reloads the messages.</p>

<p>Now is the time to add Login and Logout buttons and bind them to actions. Those buttons will be visible only when necessary.</p>

<figure class='code'><figcaption><span>Login and logout buttons</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;button</span> <span class="na">ng-hide=</span><span class="s">&quot;session.isLoggedIn&quot;</span> <span class="na">ng-click=</span><span class="s">&quot;session.facebookLogin()&quot;</span><span class="nt">&gt;</span>Login<span class="nt">&lt;/button&gt;</span>
</span><span class='line'><span class="nt">&lt;span</span> <span class="na">ng-show=</span><span class="s">&quot;session.isLoggedIn&quot;</span> <span class="na">ng-bind=</span><span class="s">&quot;&#39;Hello &#39; + session.currentUser.name&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">ng-show=</span><span class="s">&quot;session.isLoggedIn&quot;</span> <span class="na">ng-click=</span><span class="s">&quot;session.logout()&quot;</span><span class="nt">&gt;</span>Logout<span class="nt">&lt;/button&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order the variable &#8220;session&#8221; to be recognized in the template, we will make the following assignment:</p>

<figure class='code'><figcaption><span>session assignment to $rootScope</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">run</span><span class="p">([</span><span class="s1">&#39;$rootScope&#39;</span><span class="p">,</span> <span class="s1">&#39;sessionService&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">$rootScope</span><span class="p">,</span> <span class="nx">sessionService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$rootScope</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="nx">sessionService</span><span class="p">;</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we have to define the authState() method that handles the result from the authentication pop-up window:</p>

<figure class='code'><figcaption><span>app.authState() definition</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">run</span><span class="p">([</span><span class="s1">&#39;$rootScope&#39;</span><span class="p">,</span> <span class="s1">&#39;$window&#39;</span><span class="p">,</span> <span class="s1">&#39;sessionService&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">$rootScope</span><span class="p">,</span> <span class="nx">$window</span><span class="p">,</span> <span class="nx">sessionService</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$window</span><span class="p">.</span><span class="nx">app</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">authState</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$rootScope</span><span class="p">.</span><span class="nx">$apply</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">switch</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">case</span> <span class="s1">&#39;success&#39;</span><span class="o">:</span>
</span><span class='line'>                        <span class="nx">sessionService</span><span class="p">.</span><span class="nx">authSuccess</span><span class="p">(</span><span class="nx">user</span><span class="p">);</span>
</span><span class='line'>                        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>                    <span class="k">case</span> <span class="s1">&#39;failure&#39;</span><span class="o">:</span>
</span><span class='line'>                        <span class="nx">sessionService</span><span class="p">.</span><span class="nx">authFailed</span><span class="p">();</span>
</span><span class='line'>                        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>
One last thing to do is to determine the authentication state when the application loads. On our template we add a script that assigns the current user (or null) to window.user:</p>

<figure class='code'><figcaption><span>Assigning the current user to window.user</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nb">window</span><span class="p">.</span><span class="nx">user</span> <span class="o">=</span> <span class="o">&lt;%-</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="o">%&gt;</span><span class="p">;</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Where the &#8220;user&#8221; variable comes from our endpoint:</p>

<figure class='code'><figcaption><span>Injecting the current user to the view</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/*&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">user</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span> <span class="o">?</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span> <span class="o">:</span> <span class="kc">null</span> <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And when the front end application loads, we initialize the session according to window.user:</p>

<figure class='code'><figcaption><span>Initiate the front end session state</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">run</span><span class="p">([</span><span class="s1">&#39;sessionService&#39;</span><span class="p">,</span> <span class="s1">&#39;$window&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">sessionService</span><span class="p">,</span> <span class="nx">$window</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">$window</span><span class="p">.</span><span class="nx">user</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">sessionService</span><span class="p">.</span><span class="nx">authSuccess</span><span class="p">(</span><span class="nx">$window</span><span class="p">.</span><span class="nx">user</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Congratulations! Now we have a secured application with facebook authentication!</p>

<h2>Download &amp; GitHub &amp; Demo</h2>

<ul>
<li>Download the application with authentication support <a target="_blank" href="../code/single-page-application-authentication/single-page-application-with-authentication.zip">here</a> (don&#8217;t forget to run &#8216;npm install&#8217; before starting the application with &#8216;npm start&#8217;)</li>
<li>See a demonstration of the application <a target="_blank" href="http://spa-auth.herokuapp.com/">here</a></li>
<li>Visit the <a href="https://github.com/naorye/spa-auth" target="_blank">GitHub repository</a></li>
</ul>


<p>I hope this article helped you understanding how to add authentication support for your single page application. Feel free to leave comments and questions!</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pages Slider With JavaScript And CSS]]></title>
    <link href="http://webdeveasy.com/pages-slider-with-javascript-and-css/"/>
    <updated>2013-08-06T02:37:31+03:00</updated>
    <id>http://webdeveasy.com/pages-slider-with-javascript-and-css</id>
    <content type="html"><![CDATA[<p>In this article I will show you how to build a pages slider that looks like those on our smartphones. At the end we will get this:</p>

<div class="example">
    Slide left to see this in action:
    <br/> 
    <div class="slider">
        <div class="content">
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
            <div class="page"></div>
        </div>
    </div>
</div>


<script type="text/javascript">
    $(function() {
        $('.slider').pagesSliderTouch();
    });
</script>


<!-- more -->


<h2>Slider Markup Structure</h2>

<p>Our slider consist of div contained in another div. The parent div has limited width with overflow set to &#8220;hidden&#8221;. The child div contains the pages and therefore has their total width. This way only one page is visible and in order to move between pages all we have to do is change the child div&#8217;s position relative to its parent. Important thing to mention is that we won&#8217;t really change the child div&#8217;s position property but will use CSS transform property to simulate this. Here is a sketch of the slider markup structure:</p>

<p><img class="center" src="http://webdeveasy.com/code/pages-slider-with-javascript-and-css/images/markup.png" title="'Slider Markup Structure'" ></p>

<p>According to this plan, let&#8217;s write a markup for four pages with relevant CSS properties:</p>

<figure class='code'><figcaption><span>Pages slider plugin markup</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;slider&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>Slider plugin style</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.slider</span> <span class="p">{</span> <span class="k">overflow</span><span class="o">:</span> <span class="k">hidden</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.slider</span> <span class="nc">.content</span> <span class="p">{</span> <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.slider</span> <span class="nc">.content</span> <span class="nc">.page</span> <span class="p">{</span> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This CSS is mandatory in order to give our slider the correct appearance. In addition, we have to style the pages. Their style is not mandatory for the plugin behavior and it&#8217;s only purpose is to make the pages look nice.</p>

<figure class='code'><figcaption><span>Pages style</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.page</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">2px</span><span class="p">;</span>
</span><span class='line'>    <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="k">inset</span> <span class="m">0</span> <span class="m">0</span> <span class="m">6px</span> <span class="m">0</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">.</span><span class="m">4</span><span class="p">);</span>
</span><span class='line'>    <span class="k">background-repeat</span><span class="o">:</span> <span class="k">no-repeat</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="n">cover</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.page</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">1</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;http://www.lorempixum.com/300/100/?1&#39;)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.page</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">2</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;http://www.lorempixum.com/300/100/?2&#39;)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.page</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">3</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;http://www.lorempixum.com/300/100/?3&#39;)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.page</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">4</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;http://www.lorempixum.com/300/100/?4&#39;)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Keep in mind that all the pages must have equal width. In our example, page size is 300px width and 100px height. In order to make this example interesting, each page contains a random image. <br/>
Now all we are left to do is writing the plugin&#8217;s behavior.</p>

<h2>Slider Behavior</h2>

<p>Our slider behavior is very simple. All we have to do is to bind to mouse down, mouse move and mouse up events, and move the pages accordingly. <br/>
I will start to write this plugin with prototype, so if you are not familiar with prototype, my <a href="http://webdeveasy.com/javascript-prototype" target="_blank">JavaScript Prototype</a> article can be a good reference. Later I will integrate the plugin to jQuery plugin but you can easily integrate it yourself to an AngularJS directive or whatever you like. At the end I will integrate the plugin with <a href="http://eightmedia.github.io/hammer.js" target="_blank">Hammer.js</a> so the plugin will work also with touch gestures. <br/>
Ok, enough talking. Let&#8217;s write our plugin.</p>

<h2>PagesSlider Initialization and Events Binding</h2>

<figure class='code'><figcaption><span>PagesSlider initialization and events binding</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">PagesSlider</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">slider</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">slider</span> <span class="o">=</span> <span class="nx">slider</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">content</span> <span class="o">=</span> <span class="nx">slider</span><span class="p">.</span><span class="nx">children</span><span class="p">().</span><span class="nx">first</span><span class="p">();</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">pages</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">children</span><span class="p">();</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">slider</span><span class="p">.</span><span class="nx">width</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">pages</span><span class="p">.</span><span class="nx">first</span><span class="p">().</span><span class="nx">width</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">totalWidth</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">pages</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">page</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">totalWidth</span> <span class="o">+=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">page</span><span class="p">).</span><span class="nx">width</span><span class="p">();</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">width</span><span class="p">(</span><span class="nx">totalWidth</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">bindEvents</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">PagesSlider</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">bindEvents</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_removeTransition</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">proxy</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">removeTransition</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_startDrag</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">proxy</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">startDrag</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_doDrag</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">proxy</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">doDrag</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">_endDrag</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">proxy</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">endDrag</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">content</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mousedown&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_startDrag</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;transitionend&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_removeTransition</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mousemove&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_doDrag</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mouseup&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_endDrag</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">destroy</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">content</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">off</span><span class="p">(</span><span class="s1">&#39;mousedown&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_startDrag</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">off</span><span class="p">(</span><span class="s1">&#39;transitionend&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_removeTransition</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">off</span><span class="p">(</span><span class="s1">&#39;mousemove&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_doDrag</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">off</span><span class="p">(</span><span class="s1">&#39;mouseup&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_endDrag</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our constructor gets the slider element as an input. It sets the slider&#8217;s width to be equal to the first page width and sets content&#8217;s width to be equal to the pages widths sum. Since all the pages should have the same width and since slider&#8217;s overflow CSS property was set to hidden, only one page will be visible. The page that will be visible is depending on the content&#8217;s offset relative to slider.</p>

<h2>startDrag(), doDrag(), endDrag() and removeTransition()</h2>

<p>At the end of the constructor method we bind to &#8216;mousedown&#8217;, &#8216;mousemove&#8217;, &#8216;mouseup&#8217; and &#8216;transitionend&#8217; events. Let&#8217;s see the implementation of startDrag(), doDrag(), endDrag() and removeTransition():</p>

<figure class='code'><figcaption><span>startDrag(), doDrag(), endDrag() and removeTransition() implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">PagesSlider</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="nx">startDrag</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">enableDrag</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">dragStartX</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">clientX</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">doDrag</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">enableDrag</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">position</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pages</span><span class="p">.</span><span class="nx">eq</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span><span class="p">).</span><span class="nx">position</span><span class="p">();</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">delta</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">clientX</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">dragStartX</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;transform&#39;</span><span class="p">,</span> <span class="s1">&#39;translate3d(&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">delta</span> <span class="o">-</span> <span class="nx">position</span><span class="p">.</span><span class="nx">left</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px, 0, 0)&#39;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">endDrag</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">enableDrag</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">enableDrag</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">delta</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">clientX</span> <span class="o">-</span> <span class="k">this</span><span class="p">.</span><span class="nx">dragStartX</span><span class="p">;</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">delta</span><span class="p">)</span> <span class="o">&gt;</span> <span class="k">this</span><span class="p">.</span><span class="nx">slider</span><span class="p">.</span><span class="nx">width</span><span class="p">()</span> <span class="o">/</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="nx">delta</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">this</span><span class="p">.</span><span class="nx">next</span><span class="p">();</span>
</span><span class='line'>                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">this</span><span class="p">.</span><span class="nx">prev</span><span class="p">();</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">current</span><span class="p">();</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">removeTransition</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;transition&#39;</span><span class="p">,</span> <span class="s1">&#39;none&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>On startDrag() we enable dragging and store the current X position in order to calculate dragging delta. <br/>
On doDrag() we validate that dragging is enabled (mouse is down) and then calculate the delta and transform the content strip&#8217;s position according to the delta. <br/>
On endDrag() we disable dragging and move to the new page (previous, next or center the current page). <br/>
The endDrag() method uses next(), prev() and current() methods in order to center the relevant page. Those methods are using CSS animation in order to make smoother transitions. Later, when we use mouse for dragging, we don&#8217;t need that animation. Therefore, after the transition ends, we remove the animation using removeTransition() method.</p>

<h2>next(), prev() and current()</h2>

<figure class='code'><figcaption><span>next(), prev() and current() implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">PagesSlider</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="p">.</span>
</span><span class='line'>    <span class="nx">goToIndex</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">position</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pages</span><span class="p">.</span><span class="nx">eq</span><span class="p">(</span><span class="nx">index</span><span class="p">).</span><span class="nx">position</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">content</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;transition&#39;</span><span class="p">,</span> <span class="s1">&#39;all 400ms ease&#39;</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;transform&#39;</span><span class="p">,</span> <span class="s1">&#39;translate3d(&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="nx">position</span><span class="p">.</span><span class="nx">left</span><span class="p">))</span> <span class="o">+</span> <span class="s1">&#39;px, 0, 0)&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">=</span> <span class="nx">index</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">current</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">goToIndex</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">next</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">&gt;=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pages</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">current</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">goToIndex</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">prev</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">current</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">goToIndex</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentIndex</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last methods of the plugin are obvious. goToIndex() is a central method that gets a page index and makes a transition to that page. next(), prev() and current() validates that the new page&#8217;s index is possible (for example, the index cannot be less than 0) and uses goToIndex() to make a transition to the new page.</p>

<p>That&#8217;s it! Pretty simple.</p>

<h2>Integrate with jQuery Plugin</h2>

<p>Now that we have the plugin code, integrating it into jQuery plugin is not a big deal. If you are not familiar with the <a href="http://webdeveasy.com/jquery-plugin-pattern" target="_blank">jQuery plugin pattern</a>, I advice you to read <a href="http://webdeveasy.com/jquery-plugin-pattern" target="_blank">this post</a>.</p>

<figure class='code'><figcaption><span>jQuery plugin integration</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">pagesSlider</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">slider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">$this</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">slider</span><span class="p">);</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">pagesSlider</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PagesSlider</span><span class="p">(</span><span class="nx">$this</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">$this</span><span class="p">.</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;pagesSlider&#39;</span><span class="p">,</span> <span class="nx">pagesSlider</span><span class="p">);</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And in order to invoke the plugin:</p>

<figure class='code'><figcaption><span>jQuery plugin invocation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.slider&#39;</span><span class="p">).</span><span class="nx">pagesSlider</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Integrate with Hammer.js</h2>

<p>Hammer.js is a JavaScript library for multi-touch gestures. Although we don&#8217;t need multi-touch support, we want our users to be able to slide between pages by touch.
Let&#8217;s download Hammer.js jQuery plugin and initialize Hammer in the scope of the slider before calling the plugin:</p>

<figure class='code'><figcaption><span>Initialize Hammer.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">pagesSliderTouch</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">hammer</span><span class="p">();</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">slider</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">...</span>
</span><span class='line'>        <span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, all we have to do is to change the events binding to Hammer&#8217;s events. Changing &#8216;mousedown&#8217;, &#8216;mousemove&#8217; and &#8216;mouseup&#8217; to &#8216;dragstart&#8217;, &#8216;drag&#8217; and &#8216;dragend&#8217; will do the job.</p>

<h2>Demo &amp; Download</h2>

<ul>
<li><a href="../code/pages-slider-with-javascript-and-css/index.html" target="_blank">Here</a> you can find a demo page.</li>
<li><a href="../code/pages-slider-with-javascript-and-css/pages-slider-with-javascript-and-css.zip" target="_blank">Here</a> you can download the source code.</li>
</ul>


<p>That&#8217;s all! have fun and don&#8217;t hesitate to leave your comments!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone Cleanup]]></title>
    <link href="http://webdeveasy.com/backbone-cleanup/"/>
    <updated>2013-04-30T21:09:00+03:00</updated>
    <id>http://webdeveasy.com/backbone-cleanup</id>
    <content type="html"><![CDATA[<p>Backbone allows our users to browse our website without refreshing the page. Each page the user visits consists of several Backbone views which are replaced whenever the user navigates. Views reflect our data models and interact with each other. This can be done by listening and triggering events which add functionality to the page. Whenever the view is replaced, there is a need to clean up the removed view, unbind events and remove unmanaged structure. <br/>
This article suggests a solution to the views cleanup problem.<!-- more --> <br/>
Keep in mind that this is only a suggestion as Backbone doesn&#8217;t bind us to a specific solution. Your solution should be the one that fit your application structure and requirements.</p>

<h2>Cleanup Router</h2>

<p>We want to cleanup views. In order to do this, we have to find where and when a view is not relevant anymore. After thinking a little I understood that this resides somewhere inside the router, the place where views are replaced by other views. Actually, we want to cleanup the view <strong>right before</strong> the navigation. Unfortunately, Backbone.Router has no &#8220;before-navigate&#8221; event, so we have to override Router&#8217;s &#8216;navigate()&#8217; method and do whatever we want before calling the original &#8216;navigate()&#8217; method. Let&#8217;s define the Router&#8217;s &#8216;currentView&#8217; member as a reference to the current visible view. Then we can do:</p>

<figure class='code'><figcaption><span>Backbone.CleanupRouter class first sketch</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupRouter</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">navigate</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">.</span><span class="nx">cleanupAll</span><span class="p">();</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">navigate</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way, each time the user navigates between pages, the router calls the current view&#8217;s &#8216;cleanupAll()&#8217; method and then do the navigation. <br/>
In order to let instances of such a router to mark the current view, let&#8217;s add &#8216;markCurrentView()&#8217; method:</p>

<figure class='code'><figcaption><span>Backbone.CleanupRouter class second sketch</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupRouter</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">navigate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">.</span><span class="nx">cleanupAll</span><span class="p">();</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">navigate</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">markCurrentView</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">view</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span> <span class="o">=</span> <span class="nx">view</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, CleanupRouter&#8217;s instance can be something like:</p>

<figure class='code'><figcaption><span>Backbone.CleanupRouter instance example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupRouter</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">routes</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;page-a&#39;</span><span class="o">:</span> <span class="s1">&#39;pageA&#39;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">pageA</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="c1">// create a view for page A</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">markCurrentView</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>After looking on the original Backbone.Router&#8217;s &#8216;navigate()&#8217; method, I noticed that there are some cases where the navigate exits without replacing the view (for example, navigation to the same current route should do nothing). In such cases, we don&#8217;t need to cleanup the current view. Let&#8217;s change our custom &#8216;navigate()&#8217; to exit in those cases:</p>

<figure class='code'><figcaption><span>Backbone.CleanupRouter class final sketch</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">routeStripper</span> <span class="o">=</span> <span class="sr">/^[#\/]/</span><span class="p">;</span>
</span><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupRouter</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">navigate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fragment</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Filter cases where navigate exists without navigate</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">History</span><span class="p">.</span><span class="nx">started</span><span class="p">)</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">frag</span> <span class="o">=</span> <span class="p">(</span><span class="nx">fragment</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="nx">routeStripper</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">fragment</span> <span class="o">==</span> <span class="nx">frag</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span><span class="p">.</span><span class="nx">cleanupAll</span><span class="p">();</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">navigate</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">markCurrentView</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">view</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">currentView</span> <span class="o">=</span> <span class="nx">view</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Cleanup View</h2>

<p>Now we have to define a view that has a &#8216;cleanupAll()&#8217; method. This view should clean up itself when calling &#8216;cleanupAll()&#8217;:</p>

<figure class='code'><figcaption><span>Backbone.CleanupView class first sketch</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">cleanup</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// This method should be overridden by each view and should</span>
</span><span class='line'>        <span class="c1">// contains all the cleanup commands</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanupAll</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">cleanup</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Backbone views can hold nested views. Whenever we cleanup a view, we need to clean also it&#8217;s nested views. In order to do that, each view should have a reference to all it&#8217;s nested views. Let&#8217;s implement this:</p>

<figure class='code'><figcaption><span>Backbone.CleanupView class last sketch</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">constructor</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">nestedViews</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>        <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">setNestedView</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">view</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">nestedViews</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanup</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// This method should be overridden</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanupAll</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="k">in</span> <span class="k">this</span><span class="p">.</span><span class="nx">nestedViews</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">nestedViews</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">cleanup</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">nestedViews</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">cleanup</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, CleanupView&#8217;s instance can be something like:</p>

<figure class='code'><figcaption><span>Backbone.CleanupView instance example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupView</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Render current view</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">nested</span> <span class="o">=</span> <span class="c1">// create a nested view which is</span>
</span><span class='line'>                     <span class="c1">// also instance of CleanupView</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">nested</span><span class="p">.</span><span class="nx">$el</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">setNestedView</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanup</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// Cleanup current view only</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Example</h2>

<p>In order to test our cleanup plugin, I have created a small application that uses it and logs the &#8216;render()&#8217; and &#8216;cleanup()&#8217; methods. The application contains one router of CleanupRouter type and two views of CleanupView type (with templates):</p>

<figure class='code'><figcaption><span>Application router</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Router</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupRouter</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">routes</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;&#39;</span><span class="o">:</span> <span class="s1">&#39;index&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39;single-view&#39;</span><span class="o">:</span> <span class="s1">&#39;singleView&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39;nested-view&#39;</span><span class="o">:</span> <span class="s1">&#39;nestedView&#39;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">index</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">navigate</span><span class="p">(</span><span class="s1">&#39;single-view&#39;</span><span class="p">,</span> <span class="p">{</span><span class="nx">trigger</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">singleView</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SingleView</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#view&#39;</span><span class="p">).</span><span class="nx">empty</span><span class="p">().</span><span class="nx">append</span><span class="p">(</span><span class="nx">view</span><span class="p">.</span><span class="nx">$el</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">markCurrentView</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">nestedView</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">NestedView</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#view&#39;</span><span class="p">).</span><span class="nx">empty</span><span class="p">().</span><span class="nx">append</span><span class="p">(</span><span class="nx">view</span><span class="p">.</span><span class="nx">$el</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">markCurrentView</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our router renders instances of SingleView and NestedView according to the route. After each render we call &#8216;markCurrentView()&#8217; in order to mark the current view.</p>

<figure class='code'><figcaption><span>SingleView view</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">SingleView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupView</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">className</span><span class="o">:</span> <span class="s1">&#39;single-view&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">template</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">singleViewTemplate</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Render: SingleView (&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cid</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">();</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="nx">template</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanup</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Cleanup: SingleView (&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cid</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>single-view.html template</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">Single</span> <span class="nx">View</span><span class="o">&lt;</span><span class="err">/h2&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>SingleView&#8217;s template contains only a title. Each time &#8216;render()&#8217; and &#8216;cleanup()&#8217; are called, the application logs the action.</p>

<figure class='code'><figcaption><span>NestedView view</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">NestedView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CleanupView</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">className</span><span class="o">:</span> <span class="s1">&#39;nested-view&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">template</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">nestedViewTemplate</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;click .add-view&#39;</span><span class="o">:</span> <span class="s1">&#39;addView&#39;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Render: NestedView (&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cid</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">();</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="nx">template</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">cleanup</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Cleanup: NestedView (&#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">cid</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">addView</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SingleView</span><span class="p">();</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">view</span><span class="p">.</span><span class="nx">$el</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">setNestedView</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span>nested-view.html template</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">Nested</span> <span class="nx">View</span><span class="o">&lt;</span><span class="err">/h2&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">button</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&quot;add-view&quot;</span><span class="o">&gt;</span><span class="nx">Add</span> <span class="nx">View</span><span class="o">&lt;</span><span class="err">/button&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>NestedView&#8217;s template contains a title and a button. Each time this button is pressed, the view creates and appends to itself a SingleView instance. In addition, by calling &#8216;setNestedView()&#8217;, the view registers the new SingleView instance to the nested views array. As in SingleView, calls to &#8216;render()&#8217; and &#8216;cleanup()&#8217; are logged.</p>

<p>You can see the application in action <a target="_blank" href="../code/backbone-cleanup/example/">here</a>. Try to navigate between views and add nested views in order to see in the log how &#8216;render()&#8217; and &#8216;cleanup()&#8217; take place in the application flow.</p>

<h2>Download &amp; GitHub &amp; Demo</h2>

<ul>
<li><a href="../code/backbone-cleanup/backbone-cleanup.zip" target="_blank">Backbone Cleanup Download</a></li>
<li><a href="https://github.com/naorye/BackboneCleanup" target="_blank">Backbone Cleanup GitHub Repository</a></li>
<li>Example application in action <a target="_blank" href="../code/backbone-cleanup/example/">here</a>.</li>
</ul>


<p>I hope you enjoyed reading this article,</p>

<p>NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Optimize (Concatenate and Minify) RequireJS Projects]]></title>
    <link href="http://webdeveasy.com/optimize-requirejs-projects/"/>
    <updated>2013-04-19T07:32:00+03:00</updated>
    <id>http://webdeveasy.com/optimize-requirejs-projects</id>
    <content type="html"><![CDATA[<p>This article will demonstrate you how to concatenate and minify projects that are based on RequireJS. In this article I&#8217;ll use several tools that require Node.js. So, if you don&#8217;t have Node.js yet, install it <a target="_blank" href="http://nodejs.org/">here</a>.</p>

<!-- more -->


<h2>Motivation</h2>

<p>A lot has been written already about RequireJS. This tool allows you to easily separate your JavaScript code into several modules and by this keep your code modular and easy to maintain. Then, you get many JavaScript files that have dependency relation. By adding one script reference to RequireJS in your html file, you can load all the required scripts for your page. <br/>
Still, in production, this is a bad practice to leave all JavaScript files separated. Making many requests, no matter how small the requested files are, take time. This time can be saved by concatenating scripts that reduce the number of requests and save the loading time. <br/>
Another technique to save loading time is to reduce the size of the requested files, a small file can be delivered faster. This process is called <a target="_blank" href="http://en.wikipedia.org/wiki/Minification_%28programming%29">minification</a> and it is done by carefully changing the script&#8217;s code without changing its behavior and functionality. Such changes can be: removing unnecessary characters like spaces, mangling variables and methods names and so on.
This process of concatenation and minification is called optimization. In addition to JavaScript files optimization, the same methods are used to optimize CSS files. <br/>
RequireJS has two main methods: define() and require(). These methods basically have similar declaration and they both know to load dependencies and then execute a callback function.
Unlike require(), define() is used to store code as a named module. Therefore the define()&#8217;s callback function should return a value to define the module. Such modules are called <a target="_blank" href="http://requirejs.org/docs/whyamd.html">AMD</a> (Asynchronous Module Definition).</p>

<p>If you are not familiar with RequireJS or didn&#8217;t fully understand what I wrote - don&#8217;t worry. An example is about to come.</p>

<h2>JavaScript Application Optimization</h2>

<p>In this section I will demonstrate the optimization of Addy Osmani&#8217;s <a target="_blank" href="http://todomvc.com/dependency-examples/backbone_require/">TodoMVC Backbone.js + RequireJS project</a>. Since the TodoMVC project contains many implementations of TodoMVC in different frameworks, I downloaded version 1.1.0 and draw out the Backbone.js + RequireJS application. Download the application from
<a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc.zip">here</a> and extract the zip file. The extracted todo-mvc directory will be our example root path and from now on I&#8217;ll refer to this directory as &lt;root&gt;. <br/>
If you&#8217;ll look on &lt;root&gt;/index.html file, you will see it contains only one script tag (and another one if you use Internet Explorer):</p>

<figure class='code'><figcaption><span>index.html scripts refrences</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">data-main=</span><span class="s">&quot;js/main&quot;</span> <span class="na">src=</span><span class="s">&quot;js/lib/require/require.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="c">&lt;!--[if IE]&gt;</span>
</span><span class='line'><span class="c">    &lt;script src=&quot;js/lib/ie.js&quot;&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="c">&lt;![endif]--&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In fact, the only tag required for loading the whole project&#8217;s scripts is the require.js script tag. If you&#8217;ll launch <a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc/">the project</a> in your browser and look under the network tab of your favorite inspection tool, you will notice that your browser has also loaded other JavaScript files: <br/>
<img class="right" src="http://webdeveasy.com/code/optimize-requirejs-projects/loaded-js-files-list.png" title="Loaded JavaScript Files List" alt="Loaded JavaScript Files List"> <br/>
All the scripts marked inside the red square were loaded by RequireJS.</p>

<p>To optimize the project we will use <a target="_blank" href="http://requirejs.org/docs/optimization.html">RequireJS Optimizer</a>. Follow the <a target="_blenk" href="http://requirejs.org/docs/optimization.html#download">download instructions</a>, get r.js and copy it to the &lt;root&gt; directory. jrburke&#8217;s <a target="_blank" href="https://github.com/jrburke/r.js">r.js</a> is a command line tool that can run AMD based projects, but what is more important, it includes the RequireJS Optimizer which allows us to concatenate and minify scripts.<br/>
RequireJS Optimizer has many usages. It can optimize single JavaScript or single CSS file, it can optimize a whole project or only part of it as well as multi-page application. It can also use different minification engines or no minification at all, and so on. This article has no intention to cover all the possibilities of RequireJS Optimizer, but to demonstrate a usage.</p>

<p>As I mentioned earlier, we will use Node.js in order to run the optimizer. The following command runs it:</p>

<figure class='code'><figcaption><span>Run RequireJS Optimizer</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node r.js -o &lt;arguments&gt;
</span></code></pre></td></tr></table></div></figure>


<p>There are two ways to supply arguments to the optimizer. One way is to specify arguments on the command line:</p>

<figure class='code'><figcaption><span>Arguments on the command line</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node r.js -o <span class="nv">baseUrl</span><span class="o">=</span>. <span class="nv">name</span><span class="o">=</span>main <span class="nv">out</span><span class="o">=</span>main-built.js
</span></code></pre></td></tr></table></div></figure>


<p>Other way is to specify a build profile file (relative to the execution folder) that contains the arguments:</p>

<figure class='code'><figcaption><span>Arguments on build profile file</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node r.js -o build.js
</span></code></pre></td></tr></table></div></figure>


<p>And build.js content:</p>

<figure class='code'><figcaption><span>Arguments on build profile file</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">({</span>
</span><span class='line'>    <span class="nx">baseUrl</span><span class="o">:</span> <span class="s2">&quot;.&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;main&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">out</span><span class="o">:</span> <span class="s2">&quot;main-built.js&quot;</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>I think a build profile file is more readable than command line arguments so I&#8217;ll use this method. Let&#8217;s create our &lt;root&gt;/build.js file and see which arguments it contains:</p>

<figure class='code'><figcaption><span>&lt;root&gt;/build.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">({</span>
</span><span class='line'>    <span class="nx">appDir</span><span class="o">:</span> <span class="s1">&#39;./&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">baseUrl</span><span class="o">:</span> <span class="s1">&#39;./js&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">dir</span><span class="o">:</span> <span class="s1">&#39;./dist&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">modules</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;main&#39;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="nx">fileExclusionRegExp</span><span class="o">:</span> <span class="sr">/^(r|build)\.js$/</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">optimizeCss</span><span class="o">:</span> <span class="s1">&#39;standard&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">removeCombined</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">jquery</span><span class="o">:</span> <span class="s1">&#39;lib/jquery&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">underscore</span><span class="o">:</span> <span class="s1">&#39;lib/underscore&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">backbone</span><span class="o">:</span> <span class="s1">&#39;lib/backbone/backbone&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">backboneLocalstorage</span><span class="o">:</span> <span class="s1">&#39;lib/backbone/backbone.localStorage&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">text</span><span class="o">:</span> <span class="s1">&#39;lib/require/text&#39;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">underscore</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;_&#39;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">backbone</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>                <span class="s1">&#39;underscore&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;jquery&#39;</span>
</span><span class='line'>            <span class="p">],</span>
</span><span class='line'>            <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;Backbone&#39;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">backboneLocalstorage</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;backbone&#39;</span><span class="p">],</span>
</span><span class='line'>            <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;Store&#39;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Understanding all the configurations of RequireJS Optimizer is not the aim of this article, but I want do describe the arguments I used:</p>

<table>
<thead>
<tr>
<th>Argument            </th>
<th> Description </th>
</tr>
</thead>
<tbody>
<tr>
<td>appDir              </td>
<td> The directory that contains the application (the &lt;root&gt; directory). All the files sitting under this directory will be copied from here to the dir argument.</td>
</tr>
<tr>
<td>baseUrl             </td>
<td> A path, relative to appDir, that represents the anchor path for finding files.</td>
</tr>
<tr>
<td>dir                 </td>
<td> This is the output directory which all the application files will be copied to.</td>
</tr>
<tr>
<td>modules             </td>
<td> Array that contains objects. Each object represents a module that should be optimize.</td>
</tr>
<tr>
<td>fileExclusionRegExp </td>
<td> Each file or directory that will be match to this regular expression will not be copied to our output directory. Since we located r.js and build.js under the application directory, we want the optimizer to exclude them. Therefore we set this argument to /&#94;(r|build)&#92;.js$/.</td>
</tr>
<tr>
<td>optimizeCss         </td>
<td> RequireJS Optimizer automatically optimizes our application&#8217;s CSS files. This argument controls the CSS optimization settings. Allowed values: &#8220;none&#8221;, &#8220;standard&#8221;, &#8220;standard.keepLines&#8221;, &#8220;standard.keepComments&#8221;, &#8220;standard.keepComments.keepLines&#8221;.</td>
</tr>
<tr>
<td>removeCombined      </td>
<td> If true, optimizer will remove concatenated files from the output directory.</td>
</tr>
<tr>
<td>paths               </td>
<td> Relative paths of modules.</td>
</tr>
<tr>
<td>shim                </td>
<td> Configure dependencies and exports for &#8220;browser globals&#8221; scripts, that do not use define() to declare the dependencies and set a module value.</td>
</tr>
</tbody>
</table>


<p>For more information and for advanced usage of the RequireJS Optimizer, in addition to it&#8217;s web page provided earlier, you can read the details of all the allowed optimizer configuration options <a target="_blank" href="https://github.com/jrburke/r.js/blob/master/build/example.build.js">here</a>.</p>

<p>Now that we have the build file, lets run the optimizer. Go to the &lt;root&gt; directory and execute the command:</p>

<figure class='code'><figcaption><span>Run optimizer</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node r.js -o build.js
</span></code></pre></td></tr></table></div></figure>


<p>A new folder has created: &lt;root&gt;/dist. It is important to notice that the script &lt;root&gt;/dist/js/main.js now contains all it&#8217;s combined and minified dependencies. Moreover, &lt;root&gt;/dist/css/base.css is also optimized. <br/>
Running <a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc/dist/">the optimized project</a> launches the application which looks exactly like the non-optimized version. Inspecting the page network traffic will show that only two JavaScript files were loaded:
<img class="right" src="http://webdeveasy.com/code/optimize-requirejs-projects/loaded-optimized-js-files-list.png" title="Loaded Optimized JavaScript Files List" alt="Loaded Optimized JavaScript Files List"> <br/>
RequireJs Optimizer reduced the amount of server scripts requests from 13 to 2 and reduced the total scripts size from 164KB to 58.6KB (both require.js and main.js).</p>

<h2>Overhead</h2>

<p>Apparently, after the optimization is over, we don&#8217;t need a reference to require.js because the scripts are no longer separated and all the dependencies were loaded. <br/>
Still, the optimization process concatenated all our scripts and produced one optimized script file which contains many calls to define() and require(). Therefore, to allow the application work properly, define() and require() must be specified and
implemented somewhere in our application. <br/>
This issue causes a well known overhead: we always have to have any code that implement define() and require(). <strong>This code is not part of our application and it exists only due to our infrastructure considerations.</strong> This problem becomes even bigger when we want to develop a JavaScript library. Such libraries usually have small size comparing to RequireJS itself, and therefore including it in the library will cause a huge overhead.</p>

<p>At the time of writing this article, there isn&#8217;t any full solution for this overhead, but we can ease it using <a target="_blank" href="https://github.com/jrburke/almond">almond</a>. Almond is a minimalistic AMD loader which implements the RequireJS API, and so, instead of including the RequireJS implementation in our optimized code, we can include almond. <br/>
Nowadays, I am working on an optimizer that will be able to optimize RequireJS applications without overhead, but this is still a new project so there is nothing to show yet.</p>

<h2>Download &amp; Conslusion</h2>

<ul>
<li><a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc.zip">Download</a> <strong>unoptimized</strong> TodoMVC Backbone.js + RequireJS project or <a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc/">See</a> it in action.</li>
<li><a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc-optimized.zip">Download</a> <strong>optimized</strong> TodoMVC Backbone.js + RequireJS project (located under dist folder) or <a target="_blank" href="../code/optimize-requirejs-projects/todo-mvc/dist/">See</a> it in action.</li>
</ul>


<p>After reading this article, I believe you got a solid idea how to optimize your RequireJS application. I&#8217;ll be glad to answer any question you have.</p>

<p>Good Luck! <br/>
NaorYe</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Object Oriented Programming with JavaScript]]></title>
    <link href="http://webdeveasy.com/object-oriented-programming-with-javascript/"/>
    <updated>2013-03-18T23:01:00+02:00</updated>
    <id>http://webdeveasy.com/object-oriented-programming-with-javascript</id>
    <content type="html"><![CDATA[<p>As we already know, JavaScript is an object oriented language. In this article we will see JavaScript example to <a href="http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29" target="_blank">inheritance</a> and <a href="http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming" target="_blank">subtype polymorphism</a>.<!-- more -->
For solid base, I really recommend to read first about <a href="../javascript-prototype">JavaScript Prototype</a>.</p>

<h2>Base Class</h2>

<p>Lets define an Animal class. First thing to do is to define it&#8217;s constructor:</p>

<figure class='code'><figcaption><span>Animal constructor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Animal</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Pink&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, lets define Animal&#8217;s methods:</p>

<figure class='code'><figcaption><span>Animal methods</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Wuuuuuuuuuuuuushhhhhh&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">sleep</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;ZZZzzzZZZzzzZZZzzzzzz...&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">eat</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;HmnmnmHmmnmnm..BURP&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>An easy way to write this is to extend Animal.prototype (using <a href="http://api.jquery.com/jQuery.extend/" target="_blank">jQuery</a>, <a href="http://underscorejs.org/#extend" target="_blank">underscore</a> or your own implementation):</p>

<figure class='code'><figcaption><span>Animal methods using jQuery.extend</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">run</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Wuuuuuuuuuuuuushhhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;ZZZzzzZZZzzzZZZzzzzzz...&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">eat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;HmnmnmHmmnmnm..BURP&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Great, this looks better. Now we can create animals that can run, sleep and eat.</p>

<h2>Sub Class - Inharitance</h2>

<p>Lets create a Cat which is a sub class of an Animal. First create Cat&#8217;s constructor:</p>

<figure class='code'><figcaption><span>Cat constructor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">Animal</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="c1">// Call parent class constructor</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My name is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span>
</span><span class='line'>                <span class="s2">&quot; and my color is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we want Cat to have Animal&#8217;s methods, so we need something like:</p>

<figure class='code'><figcaption><span>Cat&#8217;s prototype gets Animal&#8217;s prototype</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this code will cause a problem. Adding new methods to Cat&#8217;s prototype will add those methods also to Animal (since Cat.prototype and Animal.prototype are now refrence to the same set of methods). <br/>
There are a few ways to solve this problem:</p>

<ol>
    <li>
        Use Object.create method that creates an object based on set of properties:

<figure class='code'><figcaption><span>Using Object.create</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>
    </li>
    <li>
        Use extend:

<figure class='code'><figcaption><span>Using extend</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>
    </li>
    <li>
        Dance a little:

<figure class='code'><figcaption><span>Dancing</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">sub</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">};</span>
</span><span class='line'><span class="nx">sub</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">sub</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>
    </li>
</ol>


<p>Lets add methods to Cat:</p>

<figure class='code'><figcaption><span>Add methods to Cat</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">drinkMilk</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">consoloe</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;lplplplplplp&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">fightOtherCat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Mirrrrrrrccchhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, Cat definition looks like this:</p>

<figure class='code'><figcaption><span>Cat definition</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">Animal</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My name is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span>
</span><span class='line'>                <span class="s2">&quot; and my color is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Cat</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">drinkMilk</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;lplplplplplp&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">fightOtherCat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Mirrrrrrrccchhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, meybe it will be easier to create inheritance helper:</p>

<figure class='code'><figcaption><span>Inheritance helper</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">methods</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sub</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">base</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="c1">// Call base class constructor</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Call sub class initialize method that will act like a constructor</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">sub</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">base</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">sub</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">methods</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">sub</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now creating Cat using the new helper is really simple and clear:</p>

<figure class='code'><figcaption><span>Cat definition using our inheritance helper</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">Animal</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My name is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span>
</span><span class='line'>                    <span class="s2">&quot; and my color is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">drinkMilk</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;lplplplplplp&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">fightOtherCat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Mirrrrrrrccchhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Sub Class - Subtype Polymorphism</h2>

<p>Since cats are purring when they sleep, lets override the sleep method:</p>

<figure class='code'><figcaption><span>Override base class method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">Animal</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;rrr...rrr...rrr...&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>But, what if after purring, cats getting sleep like any other animal? <br/>
Lets call the Animal&#8217;s sleep method right after purring:</p>

<figure class='code'><figcaption><span>Calling base class method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">Animal</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;rrr...rrr...rrr...&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">sleep</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now out cat will sleep like any other animal after purring a little.</p>

<h2>Complete Code</h2>

<p>Here is our complete code:</p>

<figure class='code'><figcaption><span>Complete code</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">methods</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sub</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">base</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="c1">// Call base class constructor</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Call sub class initialize method that will act like a constructor</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">sub</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">base</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">sub</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">methods</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">sub</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Animal</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Pink&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">run</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Wuuuuuuuuuuuuushhhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;ZZZzzzZZZzzzZZZzzzzzz...&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">eat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;HmnmnmHmmnmnm..BURP&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Cat</span> <span class="o">=</span> <span class="nx">inherit</span><span class="p">(</span><span class="nx">Animal</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;My name is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span>
</span><span class='line'>                    <span class="s2">&quot; and my color is &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">drinkMilk</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">consoloe</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;lplplplplplp&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">fightOtherCat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Mirrrrrrrccchhhhh&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;rrr...rrr...rrr...&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">Animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">sleep</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Usage</h2>

<p>Since I have a cat, I must create its virtual persona:</p>

<figure class='code'><figcaption><span>My virtual Mutzi</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">mutzi</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Cat</span><span class="p">(</span><span class="s2">&quot;Mutzi&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">mutzi</span><span class="p">.</span><span class="nx">run</span><span class="p">();</span>
</span><span class='line'><span class="nx">mutzi</span><span class="p">.</span><span class="nx">fightOtherCat</span><span class="p">();</span>
</span><span class='line'><span class="nx">mutzi</span><span class="p">.</span><span class="nx">sleep</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>And of course, the result will appear on the console:</p>

<figure class='code'><figcaption><span>My virtual Mutzi</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">My</span> <span class="nx">name</span> <span class="nx">is</span> <span class="nx">Mutzi</span> <span class="nx">and</span> <span class="nx">my</span> <span class="nx">color</span> <span class="nx">is</span> <span class="nx">Pink</span>
</span><span class='line'><span class="nx">Wuuuuuuuuuuuuushhhhhh</span>
</span><span class='line'><span class="nx">Mirrrrrrrccchhhhh</span>
</span><span class='line'><span class="nx">rrr</span><span class="p">...</span><span class="nx">rrr</span><span class="p">...</span><span class="nx">rrr</span><span class="p">...</span>
</span><span class='line'><span class="nx">ZZZzzzZZZzzzZZZzzzzzz</span><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Summary</h2>

<p>In this article we created the Animal base class. Then we created the Cat sub class by inherit from Animal. Then we added new methods for Cat and at the end we overridden Animal&#8217;s method and used the base class implementation in our implementation.</p>

<p>I hope you had fun reading this article! <br/>
Any questions -> to me :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone Cache]]></title>
    <link href="http://webdeveasy.com/backbone-cache/"/>
    <updated>2013-03-12T22:37:00+02:00</updated>
    <id>http://webdeveasy.com/backbone-cache</id>
    <content type="html"><![CDATA[<p>Caching collections and models in Backbone allows to save server calls and return the result faster to the user. This means happier server and happier users. This article will guide you how to implement Backbone caching.</p>

<!-- more -->


<p>In order to support caching in Backbone, first, I&#8217;ve created a Cache class that has the basic cache behavior and knows to cache key-value items. Then, I&#8217;ve created Backbone.CachedModel and Backbone.CachedCollection classes and override their fetch method so it will search the cache before fetching from the server.</p>

<h2>Cache Class</h2>

<figure class='code'><figcaption><span>Backbone.Cache class</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">Cache</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">store</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">.</span><span class="nx">Cache</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Events</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">set</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;set&quot;</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">store</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">has</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">isHas</span> <span class="o">=</span> <span class="o">!!</span><span class="k">this</span><span class="p">.</span><span class="nx">store</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;has&quot;</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">isHas</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">isHas</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">get</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">store</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;get&quot;</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">remove</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">store</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;remove&quot;</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
</span><span class='line'>        <span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">store</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">clear</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;clear&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">store</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each Cache instance holds an object that stored the data, and its methods manage this object. Cache also extends from Backbone.Events so it would be able to listen to events and trigger some.</p>

<h2>Fetch Cache</h2>

<p>In order to cache fetching results of a model, we need to know the key of the cache item and the cache object instance in which the item stored in. Therefore, each model or collection that needs caching has to define two properties: cacheKey and cacheObject.
Lets create Backbone.CachedModel and override it&#8217;s fetch method. Backbone.CachedCollection&#8217;s new fetch is pretty much the same.</p>

<figure class='code'><figcaption><span>Backbone.Model fetch override</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Backbone</span><span class="p">.</span><span class="nx">CachedModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">fetch</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// If the model has required info for cache</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">cacheKey</span> <span class="o">&amp;&amp;</span> <span class="k">this</span><span class="p">.</span><span class="nx">cacheObject</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">cacheObject</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">cacheObject</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">cacheKey</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">cacheKey</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">success</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">success</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Checking whether the cache object already holds the required data</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">cacheObject</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>                <span class="kd">var</span> <span class="nx">resp</span> <span class="o">=</span> <span class="nx">cacheObject</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Do the same as the fetch method does when the data received</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">resp</span><span class="p">,</span> <span class="nx">options</span><span class="p">),</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="nx">success</span><span class="p">)</span> <span class="nx">success</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Returns deferred as the original fetch</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">().</span><span class="nx">resolve</span><span class="p">();</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// The cache object doesn&#39;t hold the required data</span>
</span><span class='line'>                <span class="c1">// Preparing success method that set the cache </span>
</span><span class='line'>                <span class="nx">options</span><span class="p">.</span><span class="nx">success</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">entity</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">cacheObject</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">,</span> <span class="nx">resp</span><span class="p">);</span>
</span><span class='line'>                    <span class="k">if</span> <span class="p">(</span><span class="nx">success</span><span class="p">)</span> <span class="nx">success</span><span class="p">(</span><span class="nx">entity</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>                <span class="c1">// Calling the original fetch</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">fetch</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// No cache for this model, calling the original fetch</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">fetch</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s all! now, each model or collection that has cacheKey and cacheObject properties now cached.</p>

<h2>Usage Example</h2>

<p>First, there must define a cache object. There can be more then cache objects according to the need. For example, application global cache for caching application data or user cache for caching session user data.</p>

<figure class='code'><figcaption><span>Define global application cache</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">globalCache</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Cache</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, define the model and set cacheKey and cacheObject. In this example app.globalCache is used to cache the fetch results. Also, the results will be cached with the key &#8220;UserPermissions_X&#8221; (X is the user id).</p>

<figure class='code'><figcaption><span>Define UserPermissions model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">UserPermissions</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">CachedModel</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">cacheObject</span><span class="o">:</span> <span class="nx">app</span><span class="p">.</span><span class="nx">globalCache</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">userId</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;id&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">userId</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">cacheKey</span> <span class="o">=</span> <span class="s2">&quot;UserPermissions_&quot;</span> <span class="o">+</span> <span class="nx">userId</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">urlRoot</span><span class="o">:</span> <span class="s1">&#39;api/user/permissions&#39;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, somewhere in the application, call fetch to get the user permissions. The fetch method will ask the server for the data and then cache it.</p>

<figure class='code'><figcaption><span>Fetch user permissions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">user1Permissions</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">UserPermissions</span><span class="p">({</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span> <span class="p">});</span>
</span><span class='line'><span class="nx">user1Permissions</span><span class="p">.</span><span class="nx">fetch</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Later in the application, there is a need to get again the user permissions. calling fetch will immediately retrieve the user permissions from the cache object.</p>

<figure class='code'><figcaption><span>Get user permissions from cache</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">permissions</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">UserPermissions</span><span class="p">({</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span> <span class="p">});</span>
</span><span class='line'><span class="nx">permissions</span><span class="p">.</span><span class="nx">fetch</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Download &amp; GitHub</h2>

<ul>
<li><a href="../code/backbone-cache/backbone-cache.zip" target="_blank">Backbone Cache Download</a></li>
<li><a href="https://github.com/naorye/BackboneCache" target="_blank">Backbone Cache GitHub Repository</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Searcher - Backbone application demonstration]]></title>
    <link href="http://webdeveasy.com/searcher-backbone-dot-js-application-demonstration/"/>
    <updated>2013-01-23T19:03:00+02:00</updated>
    <id>http://webdeveasy.com/searcher-backbone-dot-js-application-demonstration</id>
    <content type="html"><![CDATA[<p>In this article we will build Backbone.js application along with jQuery, underscore.js and require.js. The aim of this article is to demonstrate the use of Backbone components. As we all probably know, there are more then one way to build Backbone applications so feel comfortable to adopt what you like. <br/>
At the end of this article we will have Backbone searcher application which will know to make searches using different search providers. You can see our final application in action <a href="../code/searcher/index.html" target="_blank">here</a> and can download the code <a href="../code/searcher/searcher.zip" target="_blank">here</a>.</p>

<!-- more -->


<h2>Application Loading Flow</h2>

<h3>index.html</h3>

<p>Let&#8217;s begin with our application loading flow. After typing the url, the browser starts loading the index.html file:</p>

<figure class='code'><figcaption><span>index.html</span> <a href='http://webdeveasy.com/code/searcher/index.html' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>      <span class="nt">&lt;title&gt;&lt;/title&gt;</span>
</span><span class='line'>      <span class="nt">&lt;meta</span> <span class="na">http-equiv=</span><span class="s">&quot;content-type&quot;</span> <span class="na">content=</span><span class="s">&quot;text/html; charset=utf-8&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;css/style.css&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">/&gt;</span>      
</span><span class='line'>      <span class="nt">&lt;script </span><span class="na">data-main=</span><span class="s">&quot;js/main&quot;</span> <span class="na">src=</span><span class="s">&quot;assets/js/require.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>      <span class="nt">&lt;header&gt;</span>
</span><span class='line'>          <span class="nt">&lt;nav</span> <span class="na">class=</span><span class="s">&quot;search&quot;</span><span class="nt">&gt;&lt;/nav&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/header&gt;</span>
</span><span class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;aside</span> <span class="na">class=</span><span class="s">&quot;side-bar&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>              <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;term-history&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/aside&gt;</span>
</span><span class='line'>          <span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/section&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The index.html file contains the layout of our application which include placeholders for the search section, the history section and the search results area. It also includes reference to css file and reference to the require.js script.
When the browser loads this html file, right after loading style.css, the browser loads the require.js script. Look closely and you&#8217;ll notice that require.js script tag has additional attribute called &#8220;data-main&#8221;. This attribute tells require.js to load js/main.js after require.js loads.</p>

<h3>js/main.js</h3>

<p>This file contains two sections:</p>

<ul>
<li>Configuration section that configure the require.js paths and modules.</li>
<li>Initialization section that initialize the application.</li>
</ul>


<figure class='code'><figcaption><span>js/main.js</span> <a href='http://webdeveasy.com/code/Searcher/js/main.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">require</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">jQuery</span><span class="o">:</span> <span class="s1">&#39;../assets/js/jquery-1.9.0.min&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">Underscore</span><span class="o">:</span> <span class="s1">&#39;../assets/js/underscore-min&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">Backbone</span><span class="o">:</span> <span class="s1">&#39;../assets/js/backbone-min&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">tooltipster</span><span class="o">:</span> <span class="s1">&#39;../assets/js/jquery.tooltipster&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">text</span><span class="o">:</span> <span class="s1">&#39;../assets/js/text&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s1">&#39;jQuery&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;$&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="s1">&#39;Underscore&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;_&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="s1">&#39;Backbone&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>              <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>              <span class="s1">&#39;jQuery&#39;</span>
</span><span class='line'>          <span class="p">],</span>
</span><span class='line'>          <span class="nx">exports</span><span class="o">:</span> <span class="s1">&#39;Backbone&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="s1">&#39;tooltipster&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">deps</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>              <span class="s1">&#39;jQuery&#39;</span>
</span><span class='line'>          <span class="p">]</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">require</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;router&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;app&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">,</span> <span class="nx">Router</span><span class="p">,</span> <span class="nx">app</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Backbone</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>require.js configuration allows us to map modules paths to names. For example, jQuery.js file is located in &#8220;libs/jquery-1.8.2.min&#8221;. Whenever we wish mark jQuery as a dependency, we will have to write this long path. Since jQuery is basic module and we probably use it a lot, it is better to map its path. <br/>
require.js works with <a href="http://requirejs.org/docs/whyamd.html" target="_blank">AMD modules</a>. The AMD structure tells require.js what are the dependencies and which object to return. The purpose of the shim configuration is to tell require.js for each un-AMD module what is its dependencies and which object to return. <br/>
After the configurations done, we ask require.js to load Backbone, router.js and app.js, and after that execute the initialization function. This function gets as parameters the AMD modules that require.js required to resolve and initializes the router, initializes the app and starts Backbone.history.</p>

<h3>app.js</h3>

<figure class='code'><figcaption><span>js/app.js</span> <a href='http://webdeveasy.com/code/searcher/js/app.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;models/query&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;views/search&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;views/history&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/sources-manager&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;models/source&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/library-of-congress/views/grid&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/google-search-api-for-shopping/views/list&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">QueryModel</span><span class="p">,</span> <span class="nx">SearchView</span><span class="p">,</span> <span class="nx">HistoryView</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">SourcesManager</span><span class="p">,</span> <span class="nx">SourceModel</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">LocGridView</span><span class="p">,</span> <span class="nx">GoogleListView</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Application</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Application</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">router</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">router</span> <span class="o">=</span> <span class="nx">router</span><span class="p">;</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">QueryModel</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">changes</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">this</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">navigate</span><span class="p">(</span>
</span><span class='line'>                  <span class="s1">&#39;/search/&#39;</span> <span class="o">+</span> <span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;sourceId&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;term&#39;</span><span class="p">),</span>
</span><span class='line'>                  <span class="p">{</span><span class="nx">trigger</span><span class="o">:</span> <span class="kc">false</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>          <span class="p">},</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">searchView</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SearchView</span><span class="p">({</span>
</span><span class='line'>              <span class="nx">model</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">historyView</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">HistoryView</span><span class="p">({</span>
</span><span class='line'>              <span class="nx">model</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">sourcesManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SourcesManager</span><span class="p">(</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;.content&#39;</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">model</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">sources</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>                  <span class="k">new</span> <span class="nx">SourceModel</span><span class="p">({</span>
</span><span class='line'>                      <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;library-of-congress&#39;</span><span class="p">,</span>
</span><span class='line'>                      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Library Of Congress&#39;</span><span class="p">,</span>
</span><span class='line'>                      <span class="nx">view</span><span class="o">:</span> <span class="nx">LocGridView</span>
</span><span class='line'>                  <span class="p">}),</span>
</span><span class='line'>                  <span class="k">new</span> <span class="nx">SourceModel</span><span class="p">({</span>
</span><span class='line'>                      <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;google-shopping&#39;</span><span class="p">,</span>
</span><span class='line'>                      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Google Shopping&#39;</span><span class="p">,</span>
</span><span class='line'>                      <span class="nx">view</span><span class="o">:</span> <span class="nx">GoogleListView</span>
</span><span class='line'>                  <span class="p">})</span>
</span><span class='line'>              <span class="p">]</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">searchView</span><span class="p">.</span><span class="nx">addSources</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sourcesManager</span><span class="p">.</span><span class="nx">sourcesPool</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="k">new</span> <span class="nx">Application</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Lets see what app.js initialization function does:</p>

<ul>
<li>Keeps reference of the router and initializes instance of QueryModel. This appQuery instance acts as a singleton and every time it changes, the router changes the url to &#8220;search/&lt;sourceId&gt;/&lt;term&gt;&#8221; (without trigger a route event).</li>
<li>Initializes the main views of the application - SearchView and HistoryView.</li>
<li>Creates two new search sources. For each source it is necessary to know it&#8217;s name, id (for internal purposes) and it&#8217;s main view. Later we will discuss on the sources feature.</li>
<li>Creates sourceManager that knows manage search sources (we will discuss on it later also) and adds to it the two search sources.</li>
<li>Adds the two search sources to the search view.</li>
</ul>


<p>At this point, the application loading flow is over and now the application waits for user interaction.
In order to understand completely how everything bonds together and works, we must understand the application features and components.</p>

<h3>router.js</h3>

<figure class='code'><figcaption><span>js/router.js</span> <a href='http://webdeveasy.com/code/searcher/js/router.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;app&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">,</span> <span class="nx">app</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Router</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">routes</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="s1">&#39;search/:sourceId/:term&#39;</span><span class="o">:</span> <span class="s1">&#39;searchImages&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">searchImages</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">sourceId</span><span class="p">,</span> <span class="nx">term</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">app</span><span class="p">.</span><span class="nx">appQuery</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span> <span class="p">{</span> <span class="nx">sourceId</span><span class="o">:</span> <span class="nx">sourceId</span><span class="p">,</span> <span class="nx">term</span><span class="o">:</span> <span class="nx">term</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">Router</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The router depends on app.js. Whenever a route in form &#8220;search/&lt;sourceId&gt;/&lt;term&gt;&#8221; is entered to the url, the router trigger the searchImages() method which changes the appQuery singleton.</p>

<h2>Application Features and Components</h2>

<p>Now it is time to review the searching, sources and the history features.</p>

<h3>Searching</h3>

<p>The main purpose of the application is to allow searching. The application makes searches among different search providers, therefore the input it gets from the user contains a search term and a search provider. So, we need a model to store this information. Actually, a single instance of this model will serve us during the entire use of the application. Each time the user makes a different search (change the search term or provider), the model instance changes. Later, those model changes will trigger the search.</p>

<figure class='code'><figcaption><span>js/models/query.js</span> <a href='http://webdeveasy.com/code/searcher/js/models/query.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">QueryModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">term</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">sourceId</span><span class="o">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">QueryModel</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>QueryModel has two attributes. &#8220;term&#8221; for holding the search term and &#8220;sourceId&#8221; for holding the search provider. The default value for both attributes are the empty string.</p>

<p>SearchView view creates the inputs and adds the behavior of the searching process.</p>

<figure class='code'><figcaption><span>js/views/search.js</span> <a href='http://webdeveasy.com/code/searcher/js/views/search.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>    <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;app&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;text!templates/search.html&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">app</span><span class="p">,</span> <span class="nx">searchTemplate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">SearchView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;.search&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="s1">&#39;click .search-button&#39;</span><span class="o">:</span> <span class="s1">&#39;setQuery&#39;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">searchTemplate</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">searchTemplate</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">optionTemplate</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="s2">&quot;&lt;option value=&#39;&lt;%= id %&gt;&#39;&gt;&lt;%= name %&gt;&lt;/option&gt;&quot;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">applyQuery</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">setQuery</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">term</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">searchInput</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">sourceId</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">sourceSelect</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span> <span class="p">{</span> <span class="nx">term</span><span class="o">:</span> <span class="nx">term</span><span class="p">,</span> <span class="nx">sourceId</span><span class="o">:</span> <span class="nx">sourceId</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>      <span class="nx">applyQuery</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">term</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;term&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">sourceId</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;sourceId&#39;</span><span class="p">);</span>
</span><span class='line'>          
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">searchInput</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">term</span><span class="p">);</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">sourceSelect</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">sourceId</span><span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>        <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">empty</span><span class="p">().</span><span class="nx">append</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">searchTemplate</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">searchInput</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.search-input&#39;</span><span class="p">);</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">sourceSelect</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.source-select&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">applyQuery</span><span class="p">();</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">addSources</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">sourcesPool</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">id</span> <span class="k">in</span> <span class="nx">sourcesPool</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">sourceSelect</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">optionTemplate</span><span class="p">({</span>
</span><span class='line'>                    <span class="nx">id</span><span class="o">:</span> <span class="nx">id</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">name</span><span class="o">:</span> <span class="nx">sourcesPool</span><span class="p">[</span><span class="nx">id</span><span class="p">].</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span>
</span><span class='line'>                <span class="p">}));</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">SearchView</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>SearchView renders itself on initialization, and every time appQuery changes it updates the input values. On render, the view draws itself using <a href="http://underscorejs.org/#template" target="_blank">underscore templates</a> and initializes the inputs according to the appQuery. Whenever the user clicks on the search button, the view set appQuery with the new values which causing the url to change (as we saw in app.js). Notice that SearchView uses the text plugin of require.js in order to load templates/search.html. In addition, the compiled version of templates are stored in searchTemplate and in optionTemplate in order to save compilations. SearchView contains the addSource() method which gets sourceModel instance as parameter (we will see it later) and adds the new source to the sources select list.</p>

<h3>Sources</h3>

<p>As I mentioned before, the application makes searches among different search providers. The sources mechanism is responsible for defining search providers, their models and their views. This feature includes the SourcesManager view which acts as a bridge and responsible for rendering the relevant search results according to appQuery.</p>

<figure class='code'><figcaption><span>js/sources/sources-manager.js</span> <a href='http://webdeveasy.com/code/searcher/js/sources/sources-manager.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;jQuery&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;text!templates/loading.html&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">loadingTemplate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">SourcesManager</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">loadingTemplate</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">loadingTemplate</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">sourcesPool</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">sources</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">for</span> <span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">options</span><span class="p">.</span><span class="nx">sources</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="k">this</span><span class="p">.</span><span class="nx">addSource</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">sources</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nx">changes</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">sourceId</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;sourceId&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">sourceModel</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">sourcesPool</span><span class="p">[</span><span class="nx">sourceId</span><span class="p">];</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">sourceModel</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Source &#39;</span> <span class="o">+</span> <span class="nx">sourceId</span> <span class="o">+</span> <span class="s1">&#39; not found!&#39;</span><span class="p">);</span>
</span><span class='line'>              <span class="k">return</span><span class="p">;</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">term</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;term&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">viewType</span> <span class="o">=</span> <span class="nx">sourceModel</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;view&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">viewType</span><span class="p">({</span>
</span><span class='line'>              <span class="nx">el</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">el</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Rendering &#39;</span> <span class="o">+</span> <span class="nx">sourceId</span> <span class="o">+</span> <span class="s1">&#39; with term &quot;&#39;</span><span class="o">+</span> <span class="nx">term</span> <span class="o">+</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">empty</span><span class="p">().</span><span class="nx">append</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">loadingTemplate</span><span class="p">());</span>
</span><span class='line'>          <span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">({</span> <span class="nx">term</span><span class="o">:</span> <span class="nx">term</span> <span class="p">});</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">addSource</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">sourceModel</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">sourceId</span> <span class="o">=</span> <span class="nx">sourceModel</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;id&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">sourcesPool</span><span class="p">[</span><span class="nx">sourceId</span><span class="p">]</span> <span class="o">=</span> <span class="nx">sourceModel</span><span class="p">;</span>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Adding source &#39;</span> <span class="o">+</span> <span class="nx">sourceId</span> <span class="o">+</span> <span class="s1">&#39; to the sources pool&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">SourcesManager</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When initialized with appQuery as model, SourcesManager renders itself on appQuery change. SourceManager has the ability to add sources using the addSource() function or using the initialization &#8220;sources&#8221; option. When it renders, it resolves the search provider&#8217;s view according to appQuery and renders it.
SourceManager initialization occurs inside the application initialization:</p>

<figure class='code'><figcaption><span>SourcesManager initialization</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">sourcesManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SourcesManager</span><span class="p">(</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;.content&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">model</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">appQuery</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">sources</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="k">new</span> <span class="nx">SourceModel</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;library-of-congress&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Library Of Congress&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">view</span><span class="o">:</span> <span class="nx">LocGridView</span>
</span><span class='line'>        <span class="p">}),</span>
</span><span class='line'>        <span class="k">new</span> <span class="nx">SourceModel</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;google-shopping&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Google Shopping&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">view</span><span class="o">:</span> <span class="nx">GoogleListView</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>appQuery is the SourcesManager model and the search results are rendered inside &#8220;.content&#8221; element. The search providers are also defined here using the SourceModel. Each search provider should have id, name and main view which will be displayed when selected.</p>

<figure class='code'><figcaption><span>js/models/source.js</span> <a href='http://webdeveasy.com/code/searcher/js/models/source.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">SourceModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">id</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">view</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">SourceModel</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Google Shopping search provider</h4>

<p>Let&#8217;s explore the Google Shopping search provider. It&#8217;s files located under js/sources/google-search-api-for-shopping and it consist of ProductModel, ProductsCollection, products template and it&#8217;s main view called ListView.</p>

<figure class='code'><figcaption><span>js/sources/google-search-api-for-shopping/models/product.js</span> <a href='http://webdeveasy.com/code/searcher/js/sources/google-search-api-for-shopping/models/product.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span> <span class="s1">&#39;Backbone&#39;</span> <span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ProductModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">link</span><span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">thumbnail</span><span class="o">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">parse</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">attrs</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">item</span> <span class="o">&amp;&amp;</span> <span class="nx">item</span><span class="p">.</span><span class="nx">product</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">product</span> <span class="o">=</span> <span class="nx">item</span><span class="p">.</span><span class="nx">product</span><span class="p">;</span>
</span><span class='line'>              <span class="nx">attrs</span><span class="p">.</span><span class="nx">title</span> <span class="o">=</span> <span class="nx">product</span><span class="p">.</span><span class="nx">title</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>              <span class="nx">attrs</span><span class="p">.</span><span class="nx">description</span> <span class="o">=</span> <span class="nx">product</span><span class="p">.</span><span class="nx">description</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>              <span class="nx">attrs</span><span class="p">.</span><span class="nx">link</span> <span class="o">=</span> <span class="nx">product</span><span class="p">.</span><span class="nx">link</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>              
</span><span class='line'>              <span class="k">if</span> <span class="p">(</span><span class="nx">product</span><span class="p">.</span><span class="nx">images</span> <span class="o">&amp;&amp;</span> <span class="nx">product</span><span class="p">.</span><span class="nx">images</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>                  <span class="nx">product</span><span class="p">.</span><span class="nx">images</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">status</span> <span class="o">==</span> <span class="s1">&#39;available&#39;</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>                  <span class="nx">product</span><span class="p">.</span><span class="nx">images</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">thumbnails</span> <span class="o">&amp;&amp;</span> <span class="nx">product</span><span class="p">.</span><span class="nx">images</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">thumbnails</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">attrs</span><span class="p">.</span><span class="nx">thumbnail</span> <span class="o">=</span> <span class="nx">product</span><span class="p">.</span><span class="nx">images</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">thumbnails</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">link</span><span class="p">;</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">attrs</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">ProductModel</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each product contains title, description, link for the product and a small thumbnail. The parse method is used by Backbone in order to parse the response  of single product, when fetching the data from Google.</p>

<figure class='code'><figcaption><span>js/sources/google-search-api-for-shopping/collections/products.js</span> <a href='http://webdeveasy.com/code/searcher/js/sources/google-search-api-for-shopping/collections/products.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/google-search-api-for-shopping/models/product&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">Backbone</span><span class="p">,</span> <span class="nx">ProductModel</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ProductsCollection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">model</span><span class="o">:</span> <span class="nx">ProductModel</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;https://www.googleapis.com/shopping/search/v1/public/products&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">parse</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nx">items</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">ProductsCollection</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The products collection consist of ProductModel models and the url attribute is used by Backbone fetch method.</p>

<figure class='code'><figcaption><span>js/sources/google-search-api-for-shopping/templates/products.html</span> <a href='http://webdeveasy.com/code/searcher/js/sources/google-search-api-for-shopping/templates/products.html' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;table</span> <span class="na">class=</span><span class="s">&quot;list-table&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;thead&gt;</span>
</span><span class='line'>      <span class="nt">&lt;tr&gt;</span>
</span><span class='line'>          <span class="nt">&lt;th&gt;</span>Image<span class="nt">&lt;/th&gt;</span>
</span><span class='line'>          <span class="nt">&lt;th&gt;</span>Description<span class="nt">&lt;/th&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/tr&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/thead&gt;</span>
</span><span class='line'>  <span class="nt">&lt;tbody&gt;</span>
</span><span class='line'>  <span class="err">&lt;</span>% _.each(products, function(product) { %&gt;
</span><span class='line'>      <span class="nt">&lt;tr&gt;</span>
</span><span class='line'>          <span class="nt">&lt;td&gt;&lt;img</span> <span class="na">alt=</span><span class="s">&quot;&quot;</span> <span class="na">src=</span><span class="s">&quot;&lt;%= product.thumbnail %&gt;&quot;</span> <span class="na">class=</span><span class="s">&quot;img-polaroid&quot;</span><span class="nt">/&gt;&lt;/td&gt;</span>
</span><span class='line'>          <span class="nt">&lt;td&gt;</span>
</span><span class='line'>              <span class="nt">&lt;h4&gt;&lt;a</span> <span class="na">target=</span><span class="s">&quot;_blank&quot;</span> <span class="na">href=</span><span class="s">&quot;&lt;%= product.link %&gt;&quot;</span><span class="nt">&gt;</span><span class="err">&lt;</span>%= product.title %&gt;<span class="nt">&lt;/a&gt;&lt;/h4&gt;</span>
</span><span class='line'>              <span class="nt">&lt;p&gt;</span><span class="err">&lt;</span>%= product.description %&gt;<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/td&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/tr&gt;</span>
</span><span class='line'>  <span class="err">&lt;</span>% }); %&gt;
</span><span class='line'>  <span class="nt">&lt;/tbody&gt;</span>
</span><span class='line'><span class="nt">&lt;/table&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The search results structure defined inside the products.html as a table that contains all the products. For each product, a new product row with thumbnail, title and description is created.
Search providers can contain many views. When defining the search provider in SourcesManager, we must tell which view is the main view to display. ListView is the main view of the Google Shopping search provider.</p>

<figure class='code'><figcaption><span>js/sources/google-search-api-for-shopping/views/list.js</span> <a href='http://webdeveasy.com/code/searcher/js/sources/google-search-api-for-shopping/views/list.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;jQuery&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/google-search-api-for-shopping/collections/products&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;sources/google-search-api-for-shopping/models/product&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;text!sources/google-search-api-for-shopping/templates/products.html&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">ProductsCollection</span><span class="p">,</span> <span class="nx">ProductModel</span><span class="p">,</span> <span class="nx">productsTemplate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ListView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">template</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">productsTemplate</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">products</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProductsCollection</span><span class="p">();</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">products</span><span class="p">.</span><span class="nx">fetch</span><span class="p">({</span>
</span><span class='line'>              <span class="nx">data</span><span class="o">:</span><span class="p">{</span>
</span><span class='line'>                  <span class="nx">key</span><span class="o">:</span> <span class="s1">&#39;AIzaSyDEMpzAwWS40E6TBjIA_XH76QfO0YSsvDc&#39;</span><span class="p">,</span>
</span><span class='line'>                  <span class="nx">country</span><span class="o">:</span> <span class="s1">&#39;US&#39;</span><span class="p">,</span>
</span><span class='line'>                  <span class="nx">fields</span><span class="o">:</span> <span class="s1">&#39;items(product(title,description,link,images(status,thumbnails(link))))&#39;</span><span class="p">,</span>
</span><span class='line'>                  <span class="nx">q</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">term</span><span class="p">,</span>
</span><span class='line'>                  <span class="nx">alt</span><span class="o">:</span> <span class="s1">&#39;json&#39;</span><span class="p">,</span>
</span><span class='line'>                  <span class="nx">thumbnails</span><span class="o">:</span> <span class="s1">&#39;128:128&#39;</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="nx">success</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">collection</span><span class="p">,</span> <span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>                  <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">products</span><span class="p">.</span><span class="nx">size</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                      <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">({</span><span class="nx">products</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">products</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">()}));</span>
</span><span class='line'>                  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                      <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="s1">&#39;No result found!&#39;</span><span class="p">);</span>
</span><span class='line'>                  <span class="p">}</span>
</span><span class='line'>              <span class="p">},</span> <span class="k">this</span><span class="p">),</span>
</span><span class='line'>              <span class="nx">error</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">collection</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">empty</span><span class="p">().</span><span class="nx">text</span><span class="p">(</span><span class="s1">&#39;Error get result!!&#39;</span><span class="p">);</span>
</span><span class='line'>              <span class="p">},</span> <span class="k">this</span><span class="p">)</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">ListView</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>ListView initializes ProductsCollection and on render fetch it and append the results to el. In case of an error or empty results, a relevant text message appears. Behind the scenes, the fetch method uses the jQuery.ajax function and the data option is passed to it. The data option contains needed properties for the Google Shopping api. Keep in mind that in your application you will need to use yours Google api key.
Now, whenever the user chooses Google Shopping as a search provider, SourcesManager initializes ListView which fetches the results and display them inside &#8220;.content&#8221; element.</p>

<h3>History</h3>

<p>Another feature of this application is history. The application stores queries history and enables us to make searches from history. In order to store the queries history we need a collection of QueryModel:</p>

<figure class='code'><figcaption><span>js/collections/queries.js</span> <a href='http://webdeveasy.com/code/searcher/js/collections/queries.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;models/query&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">QueryModel</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">QueriesCollection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">model</span><span class="o">:</span> <span class="nx">QueryModel</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">QueriesCollection</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, in order to display the history and make each history entry clickable, There is the HistoryView:</p>

<figure class='code'><figcaption><span>js/views/history.js</span> <a href='http://webdeveasy.com/code/searcher/js/views/history.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;jQuery&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Underscore&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;Backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;app&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;collections/queries&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;text!templates/queries-list.html&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">app</span><span class="p">,</span> <span class="nx">QueriesCollection</span><span class="p">,</span> <span class="nx">queriesListTemplate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">HistoryView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;#term-history&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="s1">&#39;click a&#39;</span><span class="o">:</span> <span class="s1">&#39;setModel&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">queriesCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">QueriesCollection</span><span class="p">();</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">addQuery</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">addQuery</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">model</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">queriesCollection</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">clone</span><span class="p">());</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">setModel</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">term</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">currentTarget</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;term&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">sourceId</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">currentTarget</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;source&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span> <span class="p">{</span> <span class="nx">term</span><span class="o">:</span> <span class="nx">term</span><span class="p">,</span> <span class="nx">sourceId</span><span class="o">:</span> <span class="nx">sourceId</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">template</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="nx">queriesListTemplate</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">({</span><span class="s1">&#39;queries&#39;</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">queriesCollection</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">()}));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">HistoryView</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>HistoryView gets appQuery as a model, and on initialization it creates QueriesCollection instance. Whenever the appQuery changes, the view adds it to queries collection and renders itself. Render takes the queries collection and generates the markup from the queriesListTemplate dependency. Whenever the user click on history entry, the setModel() function triggered and set appQuery with the history values. As a result of appQuery change, SourcesManager&#8217;s render occurred.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Prototype]]></title>
    <link href="http://webdeveasy.com/javascript-prototype/"/>
    <updated>2012-11-13T10:49:17+02:00</updated>
    <id>http://webdeveasy.com/javascript-prototype</id>
    <content type="html"><![CDATA[<p>I bet you have seen the prototype keyword before. This prototype thing is very important to know and understand especially if you want to be an expert web developer. This article will explain you about it.</p>

<!-- more -->


<h2>Prototype-Based Language</h2>

<p>This part might confuse you a little, but believe me, after some examples coming next everything will be clear. So, stop the chit chat and let&#8217;s dive into the JavaScript engine!</p>

<p>JavaScript is an object oriented language, but unlike all the <a href="http://en.wikipedia.org/wiki/Class-based_programming" target="_blank">class-based languages</a> (C++, JAVA, C#, &#8230;), JavaScript is <a href="http://en.wikipedia.org/wiki/Prototype-based_programming" target="_blank">prototype-based language</a>. In class-based languages, we write classes which can be organized into hierarchy and so advance code reuse. In prototype-based languages, there is no distinction between classes and objects. An object is used as a template for creating a new object. In addition, an object&#8217;s set of properties can be extended either at creation time or at run time. This way prototype-based language furthering code reuse. There are more differences between class-based and prototype-based languages but this is enough for now.</p>

<p>Let&#8217;s instantiate a new object. In order to do it we have to define function and then simply use the &#8220;new&#8221; keyword:</p>

<figure class='code'><figcaption><span>Instantiate a new object</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">baseObj</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">sayHi</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;Hi &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ins</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">baseObj</span><span class="p">(</span><span class="s2">&quot;Dan&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The baseObj() function is called Object Constructor since it creates and defines an object. Later we can call:</p>

<figure class='code'><figcaption><span>Hi Dan</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">ins</span><span class="p">.</span><span class="nx">sayHi</span><span class="p">();</span> <span class="c1">// Alerts &quot;Hi Dan&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will talk about this later.</p>

<h2>JavaScript&#8217;s Prototype</h2>

<p>In JavaScript, as we mentioned before, we can add properties to an object even after its creation:</p>

<figure class='code'><figcaption><span>Add properties to an object</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">animal</span><span class="p">(){</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">cat</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">animal</span><span class="p">();</span>
</span><span class='line'><span class="nx">cat</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Green&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is important to notice that the color property is added only to the cat instance. Other instances of animal will not contain the color property. But, there are times where we want to add a property to all the instances of an object. Each animal has a color and not only cats, therefore color property is relevant to all instances of animal. That&#8217;s where the prototype object of JavaScript comes in.</p>

<p>In JavaScript, each object has a property called &#8220;prototype&#8221;. An object&#8217;s prototype allows us adding properties to all instances of that object (even to the existing instances). For example:</p>

<figure class='code'><figcaption><span>Add the color property to all animal instances </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">frog</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">animal</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">frog</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span> <span class="c1">// frog doesn&#39;t have the color property yet</span>
</span><span class='line'>
</span><span class='line'><span class="nx">animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Green&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">dog</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">animal</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">dog</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span> <span class="c1">// will log &quot;Green&quot;</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">frog</span><span class="p">.</span><span class="nx">color</span><span class="p">);</span> <span class="c1">// will also log &quot;Green&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This adds and initialize the color property to every present and future animal instances.</p>

<p>Similar to properties, we can add methods and reflects all the instances:</p>

<figure class='code'><figcaption><span>Add the color method to all instances</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am running!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">dog</span><span class="p">.</span><span class="nx">run</span><span class="p">();</span> <span class="c1">// will log &quot;I am running!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This functionality allows us to do very useful things like extending the behavior of an Array and add a method that gets an element and removes it from the array:</p>

<figure class='code'><figcaption><span>Extend Array&#8217;s functionality</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">remove</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">elem</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">index</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
</span><span class='line'><span class="nx">arr</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// will keep the array to be [1, 2, 3, 5]</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example I used the &#8220;this&#8221; keyword inside the method. Keep in mind that &#8220;this&#8221; refer to the object that calls the method. In this example when calling arr.remove(4), &#8220;this&#8221; refer to arr and therefore this.indexOf(elem) returns the index of elem in arr.</p>

<h2>The Object Constructor Way</h2>

<p>Besides the prototype approach, another way to define properties and methods is by doing it inside the object constructor:</p>

<figure class='code'><figcaption><span>Define properties and methods inside the object constructor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">animal</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Green&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am running!&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mouse</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">animal</span><span class="p">();</span>
</span><span class='line'><span class="nx">mouse</span><span class="p">.</span><span class="nx">run</span><span class="p">();</span> <span class="c1">// will log &quot;I am running!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code results the same object structure as the prototype approach. Each instance of animal will have the color property and the run method.</p>

<p>The main advantage of this approach is that you can make a use of local variables defined inside the object constructor:</p>

<figure class='code'><figcaption><span>Use local variables inside an object constructor</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">animal</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">runAlready</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Green&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">runAlready</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am running!&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am already running!&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Those local variable &#8220;runAlready&#8221; is acting like private members of C# and JAVA. No one can access this variable except the object&#8217;s methods.</p>

<p>This approach might seem more readable and convenient but actually is not always recommended, especially when adding many methods. If you don&#8217;t need to use local variables defined inside the object constructor, then there is no reason to use this approach and using prototype is better. That is because if you are going to create lots of animals, a new set of methods will be created and held in different instances each time the animal constructor is called. In the prototype approach, all the instances will share one set of methods and therefore less memory.</p>

<p>You can also use combine approaches whereby methods that uses private local constructor variables will be defined inside the constructor while other methods will be added using the prototype:</p>

<figure class='code'><figcaption><span>Combined approach for extend an object&#8217;s functionality</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">animal</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">runAlready</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">runAlready</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am running!&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am already running!&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="s2">&quot;Green&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">animal</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">hide</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;I am hiding!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">horse</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">animal</span><span class="p">();</span>
</span><span class='line'><span class="nx">horse</span><span class="p">.</span><span class="nx">run</span><span class="p">();</span> <span class="c1">// will log &quot;I am running!&quot;</span>
</span><span class='line'><span class="nx">horse</span><span class="p">.</span><span class="nx">hide</span><span class="p">();</span> <span class="c1">// will log &quot;I am hiding!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>With this article we understood the meaning of prototype-based language, we saw how we can use the prototype property in order to add properties and methods to all instances of an object. We even saw a practical example of extending Array&#8217;s behavior! :) I demonstrated another way to add properties using the object constructor and explained its drawback.</p>

<p>If you wish to read more about the differences between class-based languages and prototype-based languages, dig in details about prototype and inheritance, I highly recommend to read Mozilla&#8217;s <a href="https://developer.mozilla.org/en-US/docs/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model" target="_blank">Details of the object model</a> guide.</p>

<p>I really enjoyed writing this article and I hope you enjoyed even more to read it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backbone Singleton]]></title>
    <link href="http://webdeveasy.com/backbone-singleton/"/>
    <updated>2012-11-05T19:13:36+02:00</updated>
    <id>http://webdeveasy.com/backbone-singleton</id>
    <content type="html"><![CDATA[<p>Using Backbone.js, sometimes we need a model that will act like a singleton. Other times we want to reuse the type of that singleton. This article will present two different ways of creating a singleton using Backbone.js and require.js. While the first way is simpler and more intuitive, the second allows us more flexibility</p>

<!-- more -->


<h2>Simple Singleton</h2>

<p>I am working on a little application using Backbone.js and require.js. The application lets the user making searches by a keyword. <br/>
Thinking of the model, I realized that I need a model that will hold the keyword and since the keyword is single in the application, it should be a singleton.
Because I am working with require.js, in order to simulate a singleton, I created a module that will return an instance of the Keyword model.</p>

<figure class='code'><figcaption><span>KeywordModel</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>    <span class="s1">&#39;backbone&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">Backbone</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">KeywordModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">keyword</span><span class="o">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="k">new</span> <span class="nx">KeywordModel</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way whenever I need the Keyword single instance, all I have to do is just add keyword.js as a dependency:</p>

<figure class='code'><figcaption><span>Getting the Keyword single instance</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;models/keyword&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">keywordModel</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">SearchView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">el</span><span class="o">:</span> <span class="s1">&#39;#search&#39;</span>
</span><span class='line'>      <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="s1">&#39;change&#39;</span><span class="o">:</span> <span class="s1">&#39;setModel&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">keywordModel</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span> <span class="s1">&#39;change: keyword&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="k">this</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">keyword</span> <span class="o">=</span> <span class="nx">keywordModel</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;keyword&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">keyword</span><span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">setModel</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">keyword</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">$el</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>          <span class="nx">keywordModel</span><span class="p">.</span><span class="nx">set</span><span class="p">({</span> <span class="nx">keyword</span><span class="o">:</span> <span class="nx">keyword</span> <span class="p">});</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">SearchView</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The first time require.js required to load models/keyword.js, it gets it from the server and returns a new instance of KeywordModel. The next time we ask require.js for models/keyword.js, instead of creating a new instance, require.js returns us the cached instance.</p>

<h2>Desire To Make History</h2>

<p>Now, lets assume that I want to store searches history (each history record contains only the keyword). <br/>
Obviously this means that I have to use a collection, but which model shall I use? I cannot use KeywordModel since I don&#8217;t have access to its definition. Any time I&#8217;ll ask for models/keyword.js all I get from require.js is the model instance and not it&#8217;s definition. <br/>
One solution is to create a new model and return its definition, but this solution is undesirable since we make unnecessary duplication. <br/>
In order to solve this issue we have to remember that <a href="http://backbonejs.org/#Model-extend" target="_blank">Backbone model&#8217;s extend function</a> can get an optional parameter called &#8220;classProperties&#8221;. These set of properties can be seen as static properties that are related to the class and not to the instance. Therefore our model can be:</p>

<figure class='code'><figcaption><span>Using class properties</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>    <span class="s1">&#39;backbone&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">Backbone</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">KeywordModel</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">defaults</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">keyword</span><span class="o">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">singleton</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">getAppKeyword</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">KeywordModel</span><span class="p">.</span><span class="nx">singleton</span> <span class="o">=</span>
</span><span class='line'>              <span class="nx">KeywordModel</span><span class="p">.</span><span class="nx">singleton</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">KeywordModel</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">KeywordModel</span><span class="p">.</span><span class="nx">singleton</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">KeywordModel</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now, asking for models/keyword.js as a dependency will get us the definition which can be used to retrieve the singleton by calling KeywordModel.getAppKeyword(). Here is the collection of KeywordModel models:</p>

<figure class='code'><figcaption><span>Collection of KeywordModel models</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">define</span><span class="p">([</span>
</span><span class='line'>  <span class="s1">&#39;backbone&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;models/keyword&#39;</span>
</span><span class='line'><span class="p">],</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">Backbone</span><span class="p">,</span> <span class="nx">KeywordModel</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">KeywordsCollection</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">model</span><span class="o">:</span> <span class="nx">KeywordModel</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">appKeyword</span> <span class="o">=</span> <span class="nx">KeywordModel</span><span class="p">.</span><span class="nx">getAppKeyword</span><span class="p">();</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">appKeyword</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span> <span class="s1">&#39;change: keyword&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">pushCopy</span><span class="p">,</span> <span class="k">this</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">pushCopy</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">clone</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">appKeyword</span><span class="p">.</span><span class="nx">clone</span><span class="p">();</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">clone</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">new</span> <span class="nx">KeywordsCollection</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way, any time the model&#8217;s keyword changes, a copy of the application keyword is added to the collection.</p>

<p>I hope this short article gave you another new ideas, thanks for reading!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jQuery Plugin Pattern]]></title>
    <link href="http://webdeveasy.com/jquery-plugin-pattern/"/>
    <updated>2012-10-02T22:07:46+02:00</updated>
    <id>http://webdeveasy.com/jquery-plugin-pattern</id>
    <content type="html"><![CDATA[<p>jQuery plugin is an extension to jQuery that encapsulates an ability or visual behaveiour so that it can be used later and in many different parts in a web application. This article will explain the basics of jQuery plugin and guide you how to create a simple jQuery plugin.</p>

<!-- more -->


<h2>Two jQuery Plugin Types</h2>

<p>I distinguish between two types of of jQuery plugins:</p>

<p><strong>Plugin that works on element.</strong> For example, a plugin that converts &lt;select&gt; element to an autocomplete. Such plugin is working on the select element. This kind of plugin is actually extention to the jQuery prototype (or $.fn):</p>

<figure class='code'><figcaption><span>Extention to $.fn</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">...</span> <span class="c1">//plugin content</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Invocation of such plugins looks like:</p>

<figure class='code'><figcaption><span>Plugin invocation  </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#my-elem&#39;</span><span class="p">).</span><span class="nx">myPlugin</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Plugin that doesn&#8217;t work on element.</strong> <a href="http://docs.jquery.com/Utilities" target="_blank">The utilities of jQuery</a> are good examples for such plugin. They are actually functions that located in the jQuery object (or $):</p>

<figure class='code'><figcaption><span>Extention to $</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">...</span> <span class="c1">//plugin content</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Invocation of such plugins looks like:</p>

<figure class='code'><figcaption><span>Plugin invocation </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">myPlugin</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Both types of plugins can get data as input, make DOM manipulations, make calculations, let the user interact them and much more.</p>

<h2>Limit The Scope</h2>

<p>Usually when writing jQuery plugin (or any JavaScript code), it is a good idea to limit it&#8217;s scope. This way you can prevent access to private variables and functions. In addition, using scopes may helping prevent naming conflicts. In order to limit the scope of jQuery plugin, wrap it with a function and invoke it. For example:</p>

<figure class='code'><figcaption><span>Plugin inside IIFE    </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="p">...</span> <span class="c1">//plugin content</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is called <a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/" target="_blank">Immediately-Invoked Function Expression (IIFE)</a>.</p>

<h2>The Dollar Sign</h2>

<p>The dollar sign ($) is a synonym to the jQuery library. It is shorter and look better then the &#8220;jQuery&#8221; word. Because of that, there are many other libraries that make a use with the dollar sign as a synonym. So, we have to be sure our plugin doesn&#8217;t collide with other libraries. Therefore passing jQuery as a parameter to the IIFE is a best practice:</p>

<figure class='code'><figcaption><span>Passing jQuery as a parameter to the IIFE     </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// Here we sure $ is jQuery</span>
</span><span class='line'>      <span class="p">...</span> <span class="c1">// Plugin content</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Plugin Parameters and Defaults</h2>

<p>We can pass parameters to our plugin when calling it, for example:</p>

<figure class='code'><figcaption><span>Pass parameters to our plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">myPlugin</span><span class="p">(</span><span class="nx">param1</span><span class="p">,</span> <span class="nx">param2</span><span class="p">,</span> <span class="nx">param3</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>But, sometimes our plugin will have a lot of parameters (for instance, <a href="http://www.trirand.com/blog/" target="_blank">jqGrid</a> plugin has more then 20 parameters) and some of them might be optionals. For this reason we wrap all the parameters in an object. For example, assume our plugin gets parameters &#8220;name&#8221;, &#8220;address&#8221; and &#8220;color&#8221;, we will define our plugin:</p>

<figure class='code'><figcaption><span>Define jQuery plugin with options</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>and for calling it:</p>

<figure class='code'><figcaption><span>Call jQuery plugin with options  </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">myPlugin</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Naor&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">address</span><span class="o">:</span> <span class="s1">&#39;Jerusalem&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">color</span><span class="o">:</span> <span class="s1">&#39;Green&#39;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way the user can supply only the parameters he wants. But this leads to another problem. What if the plugin need the color parameter which wasn&#8217;t supplied? The solution is simple. All we have to do is to make a defaults to the parameters:</p>

<figure class='code'><figcaption><span>Options with defaults</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">options</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;no-name&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">address</span><span class="o">:</span> <span class="s1">&#39;none&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">color</span><span class="o">:</span> <span class="s1">&#39;white&#39;</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>      <span class="p">...</span> <span class="c1">// The rest of the plugin</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way we support many options with optional parameters. <br/>
In case we want to force the user pass some parameters, we can use the old way for the compulsory parameters and an &#8220;options&#8221; object for the optionals:</p>

<figure class='code'><figcaption><span>Compulsory and optionals parameters</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// param1 is compulsory</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">param1</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>The <em>this</em> Expression</h2>

<p>Inside a plugin definition the <em>this</em> expression has a different meaning between the two plugin types. I&#8217;ll explain the meaning of the <em>this</em> expression using examples:</p>

<h3>The <em>this</em> expression for plugins that do not work on an element</h3>

<figure class='code'><figcaption><span>The &#8220;this&#8221; expression</span> <a href='http://webdeveasy.com/code/jquery-plugin-pattern/this-expression/this1.html' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="o">&lt;!</span><span class="nx">doctype</span> <span class="nx">html</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">html</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">title</span><span class="o">&gt;</span><span class="nx">jQuery</span> <span class="nx">Plugins</span><span class="o">&lt;</span><span class="err">/title&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span> <span class="nx">src</span><span class="o">=</span><span class="s2">&quot;../assets/js/jquery-1.9.0.min.js&quot;</span><span class="o">&gt;&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">$</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="c1">// Here &lt;i&gt;this&lt;/i&gt; represents the jQuery object</span>
</span><span class='line'>                  <span class="k">return</span> <span class="nx">$</span> <span class="o">===</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>              <span class="p">};</span>
</span><span class='line'>          <span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/head&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">body</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="nx">Is</span> <span class="o">&lt;</span><span class="nx">i</span><span class="o">&gt;</span><span class="k">this</span><span class="o">&lt;</span><span class="sr">/i&gt; equals jQuery? &lt;span id=&quot;isEqual&quot; /</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#isEqual&#39;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">myPlugin</span><span class="p">());</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/body&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that inside such plugin, <em>this</em> is equal to jQuery.
You can watch this example <a href="../code/jquery-plugin-pattern/this-expression/this1.html" target="_blank">here</a>.</p>

<h3>The <em>this</em> expression for plugins that do work on an element</h3>

<figure class='code'><figcaption><span>The &#8220;this&#8221; expression</span> <a href='http://webdeveasy.com/code/jquery-plugin-pattern/this-expression/this2.html' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="err">﻿</span><span class="o">&lt;!</span><span class="nx">doctype</span> <span class="nx">html</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">html</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">title</span><span class="o">&gt;</span><span class="nx">jQuery</span> <span class="nx">Plugins</span><span class="o">&lt;</span><span class="err">/title&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span> <span class="nx">src</span><span class="o">=</span><span class="s2">&quot;../assets/js/jquery-1.9.0.min.js&quot;</span><span class="o">&gt;&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="c1">// Here &lt;i&gt;this&lt;/i&gt; is a reference to the actaul jQuery</span>
</span><span class='line'>                  <span class="c1">// element the plugin works on.</span>
</span><span class='line'>                  <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                      <span class="kd">var</span> <span class="nx">current</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>                      <span class="kd">var</span> <span class="nx">elemType</span> <span class="o">=</span> <span class="nx">current</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="s1">&#39;tagName&#39;</span><span class="p">).</span><span class="nx">toLowerCase</span><span class="p">();</span>
</span><span class='line'>                      <span class="k">switch</span><span class="p">(</span><span class="nx">elemType</span><span class="p">)</span>  <span class="p">{</span>
</span><span class='line'>                          <span class="k">case</span> <span class="s1">&#39;input&#39;</span><span class="o">:</span>
</span><span class='line'>                              <span class="nx">current</span><span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span><span class='line'>                              <span class="k">break</span><span class="p">;</span>
</span><span class='line'>                          <span class="k">case</span> <span class="s1">&#39;select&#39;</span><span class="o">:</span>
</span><span class='line'>                              <span class="nx">current</span><span class="p">.</span><span class="nx">empty</span><span class="p">().</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;option&gt;&#39;</span> <span class="o">+</span> <span class="nx">text</span> <span class="o">+</span> <span class="s1">&#39;&lt;/option&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>                              <span class="k">break</span><span class="p">;</span>
</span><span class='line'>                          <span class="k">case</span> <span class="s1">&#39;span&#39;</span><span class="o">:</span>
</span><span class='line'>                              <span class="nx">current</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span><span class='line'>                              <span class="k">break</span><span class="p">;</span>
</span><span class='line'>                      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>                  <span class="p">});</span>
</span><span class='line'>              <span class="p">};</span>
</span><span class='line'>          <span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/head&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">body</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="nx">Choose</span> <span class="nx">text</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;my-text&quot;</span> <span class="o">/&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nx">button</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;my-button&quot;</span><span class="o">&gt;</span><span class="nx">Press</span> <span class="nx">here</span><span class="o">&lt;</span><span class="err">/button&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/p&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="nx">Span</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&quot;target&quot;</span><span class="o">&gt;&lt;</span><span class="sr">/span&gt; &lt;br/</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="nx">Text</span> <span class="nx">input</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text&quot;</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&quot;target&quot;</span> <span class="o">/&gt;</span> <span class="o">&lt;</span><span class="nx">br</span><span class="o">/&gt;</span>
</span><span class='line'>          <span class="nx">Select</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">select</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&quot;target&quot;</span><span class="o">&gt;&lt;</span><span class="err">/select&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/p&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#my-button&#39;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#my-text&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>                  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.target&#39;</span><span class="p">).</span><span class="nx">myPlugin</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/script&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/body&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that <em>this</em> is a reference to the main element that the plugin works on. Sometimes, like in this example, the jQuery element represents more then one DOM element and we have to iterate each one of them in order to effect all of the DOM elements. In this example each DOM element is different element and so different treatment.
You can watch this example <a href="../code/jquery-plugin-pattern/this-expression/this2.html" target="_blank">here</a>.</p>

<h2>jQuery Chaining Principal</h2>

<p><strong>jQuery Chaining Principal is relevant only to plugins that do work on an element.</strong></p>

<p>Take this code for example:</p>

<figure class='code'><figcaption><span>jQuery without chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">&#39;some value&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">prop</span><span class="p">(</span><span class="s1">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code adds css class to an element, sets its value and disables it. Instead of three different lines of code we can write:
I believe you&#8217;ve seen this syntax before:</p>

<figure class='code'><figcaption><span>jQuery chaining</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">&#39;some value&#39;</span><span class="p">).</span><span class="nx">prop</span><span class="p">(</span><span class="s1">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This looks better, easier to understand and more effective (no need to search for &#8216;#elem&#8217; a few times). This is made possible due to the jQuery chaining principal. Each jQuery method or plugin returns the element or elements that it works on:</p>

<figure class='code'><figcaption><span>jQuery chaining principal    </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">myPlugin</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">...</span>
</span><span class='line'>        <span class="p">...</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">;</span> <span class="c1">// This line responsible for chaining</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Remember that inside the plugin scope, the <em>this</em> expression referenced to the element itself.</p>

<h2>User Interface</h2>

<p>Up to now we saw a plugin structure wrapped in IIFE, with $ as jQuery and with compulsory/optional parameters. We undertsood the <em>this</em> expression inside a plugin and saw the chaining principal in action. Now we need to see how to create an interface so the user can interact with the plugin. I&#8217;ll do it separately for each plugin type.</p>

<h3>Plugin that doesn&#8217;t work on element</h3>

<p>The first plugin doesn&#8217;t work on element, it gets positions and a text as parameters and displays the text on the specified position:</p>

<figure class='code'><figcaption><span>float plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="kr">float</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;div&gt;&#39;</span><span class="o">+</span><span class="nx">text</span><span class="o">+</span><span class="s1">&#39;&lt;/div&gt;&#39;</span><span class="p">).</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">left</span><span class="o">:</span> <span class="nx">posX</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">top</span><span class="o">:</span> <span class="nx">posY</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">position</span><span class="o">:</span> <span class="s1">&#39;absolute&#39;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>    
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we want to allow the user to move the text to a new position and to remove it. Let&#8217;s write methods:</p>

<figure class='code'><figcaption><span>changePosition() and remove() methods  </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">changePosition</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">elem</span><span class="p">.</span><span class="nx">css</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">left</span><span class="o">:</span> <span class="nx">posX</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">top</span><span class="o">:</span> <span class="nx">posY</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">remove</span><span class="p">(</span><span class="nx">elem</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">elem</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="kr">float</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;div&gt;&#39;</span><span class="o">+</span><span class="nx">text</span><span class="o">+</span><span class="s1">&#39;&lt;/div&gt;&#39;</span><span class="p">).</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">left</span><span class="o">:</span> <span class="nx">posX</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">top</span><span class="o">:</span> <span class="nx">posY</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">position</span><span class="o">:</span> <span class="s1">&#39;absolute&#39;</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that the user doesn&#8217;t have an access to &#8220;changePosition&#8221; nor &#8220;remove&#8221; and he never holds the &lt;div&gt; element. So now we need to connect the user to the methods. In order to do it we make the &#8220;float&#8221; plugin return a &#8220;remote control&#8221; object:</p>

<figure class='code'><figcaption><span>jQuery plugin returns &#8220;remote control&#8221; object</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">changePosition</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">elem</span><span class="p">.</span><span class="nx">css</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">left</span><span class="o">:</span> <span class="nx">posX</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">top</span><span class="o">:</span> <span class="nx">posY</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="kd">function</span> <span class="nx">remove</span><span class="p">(</span><span class="nx">elem</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">elem</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="kr">float</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;div&gt;&#39;</span><span class="o">+</span><span class="nx">text</span><span class="o">+</span><span class="s1">&#39;&lt;/div&gt;&#39;</span><span class="p">).</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">left</span><span class="o">:</span> <span class="nx">posX</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">top</span><span class="o">:</span> <span class="nx">posY</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">position</span><span class="o">:</span> <span class="s1">&#39;absolute&#39;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">changePosition</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">changePosition</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">posX</span><span class="p">,</span> <span class="nx">posY</span><span class="p">);</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">remove</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nx">remove</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>  <span class="p">}</span>    
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whenever the user will invoke $.float(..) he will get a &#8220;remote control&#8221; object with the interface we want to provide, and in order to use it:</p>

<figure class='code'><figcaption><span>Interact with a plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">control</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="kr">float</span><span class="p">(</span><span class="s1">&#39;100px&#39;</span><span class="p">,</span> <span class="s1">&#39;100px&#39;</span><span class="p">,</span> <span class="s1">&#39;Hello!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">control</span><span class="p">.</span><span class="nx">changePosition</span><span class="p">(</span><span class="s1">&#39;200px&#39;</span><span class="p">,</span> <span class="s1">&#39;200px&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Live example for the float plugin you can find <a href="../code/jquery-plugin-pattern/float-plugin/float.html" target="_blank">here</a>.</p>

<h3>Plugin that does work on element</h3>

<p>The second plugin does work on element. It works on an &lt;input&gt; element and gets two parameters: &lt;ul&gt; selector and a number &#8220;N&#8221;. Whenever the input&#8217;s value changes, the &lt;ul&gt; gets filled with &#8220;N&#8221; items containing the value:</p>

<figure class='code'><figcaption><span>Compose plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">compose</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">options</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">number</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">ul</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">change</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>              <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="o">&lt;</span><span class="nx">options</span><span class="p">.</span><span class="nx">number</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">ul</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">)</span>
</span><span class='line'>              <span class="p">}</span>            
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we want to allow the user to change the number parameter &#8220;N&#8221;. Again, let&#8217;s write a method for changing the parameter:</p>

<figure class='code'><figcaption><span>setNumber() method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">compose</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">options</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">number</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">ul</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>      
</span><span class='line'>      <span class="kd">function</span> <span class="nx">setNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">options</span><span class="p">.</span><span class="nx">number</span> <span class="o">=</span> <span class="nx">number</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">change</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>              <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="o">&lt;</span><span class="nx">options</span><span class="p">.</span><span class="nx">number</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">ul</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">)</span>
</span><span class='line'>              <span class="p">}</span>            
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Like the former plugin example, the user doesn&#8217;t have an access to &#8220;setNumber&#8221; method. Unlike the former plugin example, here we cannot return a &#8220;remote control&#8221; object. Due to jQuery chaining principal we have to return <em>this</em>. For solving this we use <a href="http://api.jquery.com/jQuery.data/" target="_blank">jQuery.data()</a> method. This method allows us attach key-value data to an element. For example, $(&#8216;#elem&#8217;).data(&#8216;my-color&#8217;, &#8216;Green&#8217;); attaches the &#8220;my-color = Green&#8221; key-value to the element. In order to get the value of &#8220;my-color&#8221; all we have to do is: $(&#8216;#elem&#8217;).data(&#8216;my-color&#8217;) and we get &#8220;Green&#8221;.
So we use the jQuery.data() method to attach the &#8220;remote control&#8221; object to the element, and as a key we use the name of the plugin &#8220;compose&#8221;:</p>

<figure class='code'><figcaption><span>jQuery plugin returns &#8220;remote control&#8221; object</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">compose</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">options</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">number</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">ul</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>      
</span><span class='line'>      <span class="kd">function</span> <span class="nx">setNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">options</span><span class="p">.</span><span class="nx">number</span> <span class="o">=</span> <span class="nx">number</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">change</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>              <span class="kd">var</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ul</span><span class="p">).</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>              <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="o">&lt;</span><span class="nx">options</span><span class="p">.</span><span class="nx">number</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">ul</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">value</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">)</span>
</span><span class='line'>              <span class="p">}</span>            
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;compose&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">setNumber</span><span class="o">:</span> <span class="nx">setNumber</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, in order to change the number:</p>

<figure class='code'><figcaption><span>Interact with a plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">compose</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">number</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">ul</span><span class="o">:</span> <span class="s1">&#39;#ul&#39;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#elem&#39;</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s1">&#39;compose&#39;</span><span class="p">).</span><span class="nx">setNumber</span><span class="p">(</span><span class="mi">8</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And then the input&#8217;s value will appear 8 times.
Live example for the compose plugin you can find <a href="../code/jquery-plugin-pattern/compose-plugin/compose.html" target="_blank">here</a>.</p>

<h2>Summary</h2>

<p>In this article I presented two jQuery plugin types and their structure (IIFE wrap and jQuery injection as $), I explained how to add compulsory and optional parameters, demonstrated the meaning of the <em>this</em> expression and described the jQuery chaining principal. At the end I also presented a way of letting the user interact the plugins.</p>

<h3>Template of plugin that does not work on an element</h3>

<figure class='code'><figcaption><span>Template of plugin that does not work on an element</span> <a href='http://webdeveasy.com/code/jquery-plugin-pattern/templates/plugin-template-1.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="o">//</span> <span class="nt">jQuery</span> <span class="nt">plugin</span> <span class="nt">template</span> <span class="nt">for</span> <span class="nt">plugin</span> <span class="nt">that</span> <span class="nt">does</span> <span class="nt">not</span> <span class="nt">work</span> <span class="nt">on</span> <span class="nt">element</span>
</span><span class='line'><span class="o">(</span><span class="nt">function</span><span class="o">(</span><span class="err">$</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="err">$</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="err">$</span><span class="o">,</span> <span class="err">{</span>
</span><span class='line'>      <span class="n">pluginName</span><span class="o">:</span> <span class="n">function</span><span class="p">(</span><span class="n">param</span><span class="o">,</span> <span class="n">options</span><span class="p">)</span> <span class="err">{</span>
</span><span class='line'>          <span class="n">options</span> <span class="o">=</span> <span class="err">$</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="err">{</span>
</span><span class='line'>              <span class="o">//</span> <span class="n">Options</span> <span class="n">Defaults</span>
</span><span class='line'>          <span class="p">}</span><span class="o">,</span> <span class="nt">options</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="o">//</span> <span class="nt">Plugin</span> <span class="nt">content</span>
</span><span class='line'>      
</span><span class='line'>          <span class="nt">return</span> <span class="p">{</span>
</span><span class='line'>              <span class="o">//</span> <span class="n">Plugin</span> <span class="n">interface</span> <span class="n">object</span>
</span><span class='line'>          <span class="p">}</span><span class="o">;</span>
</span><span class='line'>      <span class="err">}</span>
</span><span class='line'>  <span class="err">}</span><span class="o">);</span>
</span><span class='line'><span class="err">}</span><span class="o">)(</span><span class="nt">jQuery</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Template of plugin that does work on an element</h3>

<figure class='code'><figcaption><span>Template of plugin that does not work on an element</span> <a href='http://webdeveasy.com/code/jquery-plugin-pattern/templates/plugin-template-2.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="o">//</span> <span class="nt">jQuery</span> <span class="nt">plugin</span> <span class="nt">template</span> <span class="nt">for</span> <span class="nt">plugin</span> <span class="nt">that</span> <span class="nt">does</span> <span class="nt">work</span> <span class="nt">on</span> <span class="nt">element</span>
</span><span class='line'><span class="o">(</span><span class="nt">function</span><span class="o">(</span><span class="err">$</span><span class="o">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="err">$</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="err">$</span><span class="o">.</span><span class="n">fn</span><span class="o">,</span> <span class="err">{</span>
</span><span class='line'>      <span class="n">pluginName</span><span class="o">:</span> <span class="n">function</span><span class="p">(</span><span class="n">param</span><span class="o">,</span> <span class="n">options</span><span class="p">)</span> <span class="err">{</span>
</span><span class='line'>          <span class="n">options</span> <span class="o">=</span> <span class="err">$</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="err">{</span>
</span><span class='line'>              <span class="o">//</span> <span class="n">Options</span> <span class="n">Defaults</span>
</span><span class='line'>          <span class="p">}</span><span class="o">,</span> <span class="nt">options</span><span class="o">);</span>
</span><span class='line'>
</span><span class='line'>          <span class="nt">this</span><span class="nc">.each</span><span class="o">(</span><span class="nt">function</span><span class="o">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="o">//</span> <span class="n">Operations</span> <span class="n">for</span> <span class="n">each</span> <span class="n">DOM</span> <span class="n">element</span>
</span><span class='line'>          <span class="p">}</span><span class="o">)</span><span class="nc">.data</span><span class="o">(</span><span class="s1">&#39;pluginName&#39;</span><span class="o">,</span> <span class="p">{</span>
</span><span class='line'>              <span class="o">//</span> <span class="n">Plugin</span> <span class="n">interface</span> <span class="n">object</span>
</span><span class='line'>          <span class="p">}</span><span class="o">);</span>
</span><span class='line'>      
</span><span class='line'>          <span class="nt">return</span> <span class="nt">this</span><span class="o">;</span>
</span><span class='line'>      <span class="err">}</span>
</span><span class='line'>  <span class="err">}</span><span class="o">);</span>
</span><span class='line'><span class="err">}</span><span class="o">)(</span><span class="nt">jQuery</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Demo &amp; Download</h2>

<ul>
<li>Live example for the float plugin you can find <a href="../code/jquery-plugin-pattern/float-plugin/float.html" target="_blank">here</a>.</li>
<li>Live example for the compose plugin you can find <a href="../code/jquery-plugin-pattern/compose-plugin/compose.html" target="_blank">here</a>.</li>
<li><a href="../code/jquery-plugin-pattern/jquery-plugin-pattern.zip" target="_blank">Here</a> you can find all the examples of this post and the plugins templates.</li>
</ul>


<p>I hope you find this post useful, and if you have any question, don&#8217;t hesitate to ask!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Style Your jQuery-UI Tabs]]></title>
    <link href="http://webdeveasy.com/style-your-jquery-ui-tabs/"/>
    <updated>2012-09-22T20:11:31+03:00</updated>
    <id>http://webdeveasy.com/style-your-jquery-ui-tabs</id>
    <content type="html"><![CDATA[<p>This article will explain and guide you step by step how to style your jQuery-UI tabs and make them look like this:</p>

<iframe src="http://webdeveasy.com/code/style-your-jquery-ui-tabs/style-tabs.html" width="100%"></iframe>


<!-- more -->


<p>For this example you will need <a href="http://www.jquery.com" target="_blank">jQuery</a> and <a href="http://www.jqueryui.com" target="_blank">jQuery-UI</a> for the <a href="http://jqueryui.com/demos/tabs/" target="_blank">tabs plugin</a>. There are many ways to use the tabs plugin and here I will use one of those methods.</p>

<h2>jQuery UI Tabs Markup</h2>

<p>The tabs plugin gets a parent element that contains an unordered list (&lt;ul&gt;). Each item in the list (&lt;li&gt;) represents a tab and contains an anchor (&lt;a&gt;) with a link to the data container div. For example:</p>

<figure class='code'><figcaption><span>Tabs plugin structure</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;tabsContainer&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#firstTab&quot;</span><span class="nt">&gt;</span>First Tab<span class="nt">&lt;a/&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#secondTab&quot;</span><span class="nt">&gt;</span>Second Tab<span class="nt">&lt;a/&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#thirdTab&quot;</span><span class="nt">&gt;</span>Third Tab<span class="nt">&lt;a/&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;firstTab&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Content for the first tab
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;secondTab&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Content for the second tab
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;thirdTab&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Content for the third tab
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see the parent element (&#8220;div#tabsContainer&#8221;) also contains the data containers. Each anchor has a reference to the id of the data container it represents. This way the tabs plugin knows for each tab which div to display.</p>

<h2>Our Tabs Markup</h2>

<p>This is our example&#8217;s structure:</p>

<figure class='code'><figcaption><span>Our example&#8217;s structure</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;simpleTabs&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#facebook&quot;</span><span class="nt">&gt;</span>Facebook<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#twitter&quot;</span><span class="nt">&gt;</span>Twitter<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      ......
</span><span class='line'>      ......
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;facebook&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      content about Facebook here
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;twitter&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      content about Twitter here
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  ......
</span><span class='line'>  ......
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Because this is not the final markup, I summarized and didn&#8217;t put the whole code. As you can see I created a parent div with unordered list and data containers in it. When running the tabs plugin on the code above I&#8217;ll get regular tabs as you can see:</p>

<iframe src="../code/style-your-jquery-ui-tabs/no-style-tabs.html" width="100%"></iframe>


<p>When the tabs plugin generates the tabs, it makes manipulation on the HTML elements. After generating it, the HTML looks like similar to this:</p>

<figure class='code'><figcaption><span>After applying tabs plugin</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;simpaleTabs&quot;</span> <span class="na">class=</span><span class="s">&quot;ui-tabs ui-widget ui-widget-content ui-corner-all&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;ui-state-default ui-corner-top ui-tabs-active ui-state-active&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;#facebook&quot;</span> <span class="na">class=</span><span class="s">&quot;ui-tabs-anchor&quot;</span><span class="nt">&gt;</span>Facebook<span class="nt">&lt;/a&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;ui-state-default ui-corner-top&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;#twitter&quot;</span> <span class="na">class=</span><span class="s">&quot;ui-tabs-anchor&quot;</span><span class="nt">&gt;</span>Twitter<span class="nt">&lt;/a&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>        ......
</span><span class='line'>        ......
</span><span class='line'>    <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;facebook&quot;</span> <span class="na">class=</span><span class="s">&quot;ui-tabs-panel ui-widget-content ui-corner-bottom&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        content about Facebook here
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;twitter&quot;</span> <span class="na">class=</span><span class="s">&quot;ui-tabs-panel ui-widget-content ui-corner-bottom&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        content about Twitter here
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The tabs plugin added a few classes to the elements. This is something important to know and we use this when we change styles. Now we want each tab to contain an icon and a text. Therefore we will add a div inside each anchor and it will hold the text and the icon as a background image. Notice that HTML5 allows wrapping of block-level elements like &lt;div&gt;s with basic &lt;a&gt; element. Now, each list item looks like:</p>

<figure class='code'><figcaption><span>List item new look</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#facebook&quot;</span><span class="nt">&gt;&lt;div&gt;</span>Facebook<span class="nt">&lt;/div&gt;&lt;/a&gt;&lt;/li&gt;</span>;
</span></code></pre></td></tr></table></div></figure>


<h2>Css and Tabs Style</h2>

<p>Now we are going to change the styles of our tabs. Our web application might use the tabs plugin more than once, and probably different tabs in our application will have different styles designs. For this reason we want to separate the design of the current tabs by adding a class to the parent element:</p>

<figure class='code'><figcaption><span>Add class to the parent element</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;tabsWithStyle&quot;</span> <span class="na">class=</span><span class="s">&quot;style-tabs&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way each tabs with the &#8220;style-tabs&#8221; class will share the same style and other tabs can have different styles.</p>

<p>As we saw before, the tabs plugin has changed the HTML and added some classes. Those classes and styles are defined in the jQuery-UI css file and in order to change the appearance of our tabs we need to change them. Changing the original jQuery-UI css file might distort the page since those classes are used in many ways and in many other jQuery-UI plugins. In addition, changing the original css file will prevent replacing the jQuery-UI theme because the changes might get lost. Therfore the changes will be made in our style.css file.</p>

<p>Remember the wrapper divs we added inside each anchor? Now is the time to give them background. Each div will get an &#8220;icon&#8221; class that defines width and font and maniplates the positions of the text and the icon image:</p>

<figure class='code'><figcaption><span>icon div style</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span> <span class="nc">.icon</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">color</span><span class="o">:</span> <span class="m">#787878</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-position</span><span class="o">:</span> <span class="k">center</span> <span class="m">3px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding-top</span><span class="o">:</span> <span class="m">40px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-size</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">80px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In addition, each tab&#8217;s div has a different icon image and therefore a different icon image class.</p>

<h2>Complete CSS File</h2>

<figure class='code'><figcaption><span>Tabs Style</span> <a href='http://webdeveasy.com/code/style-your-jquery-ui-tabs/style.css' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="err">﻿</span><span class="nc">.facebook-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/facebook.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.twitter-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/twitter.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.linkedin-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/linkedin.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.google-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/google.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.wikipedia-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/wikipedia.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="nc">.picasa-icon</span> <span class="p">{</span> <span class="k">background</span><span class="o">:</span> <span class="sx">url(../assets/images/picasa.png)</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">32px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">480px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span> <span class="nt">a</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-panel</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">5px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-widget-header</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background</span><span class="o">:</span> <span class="sx">url(images/TabMenu.png)</span> <span class="k">repeat</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">74px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-corner-all</span> <span class="p">{</span>
</span><span class='line'>    <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</span><span class='line'>    <span class="k">cursor</span><span class="o">:</span> <span class="k">pointer</span><span class="p">;</span>
</span><span class='line'>    <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-widget-header</span> <span class="nc">.ui-state-default</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nc">.ui-tabs-active</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nd">:hover</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">background</span><span class="o">:</span> <span class="sx">url(images/SelectedMiddle.png)</span> <span class="k">repeat</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span> <span class="nc">.icon</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">color</span><span class="o">:</span> <span class="m">#787878</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-position</span><span class="o">:</span> <span class="k">center</span> <span class="m">3px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding-top</span><span class="o">:</span> <span class="m">40px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-size</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">80px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nc">.ui-tabs-active</span> <span class="nc">.icon</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nd">:hover</span> <span class="nc">.icon</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">color</span><span class="o">:</span> <span class="m">#414141</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nc">.ui-tabs-active</span> <span class="nc">.icon</span><span class="nd">:before</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nd">:hover</span> <span class="nc">.icon</span><span class="nd">:before</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">content</span><span class="o">:</span> <span class="sx">url(images/SelectedSides.png)</span><span class="p">;</span>
</span><span class='line'>    <span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
</span><span class='line'>    <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nc">.ui-tabs-active</span> <span class="nc">.icon</span><span class="nd">:after</span><span class="o">,</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nd">:hover</span> <span class="nc">.icon</span><span class="nd">:after</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">content</span><span class="o">:</span> <span class="sx">url(images/SelectedSides.png)</span><span class="p">;</span>
</span><span class='line'>    <span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
</span><span class='line'>    <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span> <span class="nt">a</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">outline</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.style-tabs</span> <span class="nc">.ui-tabs-nav</span> <span class="nt">li</span><span class="nc">.ui-tabs-active</span> <span class="nt">a</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">cursor</span><span class="o">:</span> <span class="k">pointer</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that those classes are based on the generated markup and this is how I know which classes to change. Among the changes, those styles also:</p>

<ul>
<li>Set fixed width to the tabs container</li>
<li>Define tab hover style to look like selected tab</li>
<li>Use the &#8220;:before&#8221; and &#8220;:after&#8221; <a href="https://developer.mozilla.org/en-US/docs/CSS/Pseudo-elements" target="_blank">pseudo elements</a> in order to put an image before and after selected tab</li>
</ul>


<h2>Complete Markup</h2>

<figure class='code'><figcaption><span>Tabs Style</span> <a href='http://webdeveasy.com/code/style-your-jquery-ui-tabs/style-tabs.html' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="err">﻿</span><span class="o">&lt;!</span><span class="nt">doctype</span> <span class="nt">html</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nt">html</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nt">head</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nt">title</span><span class="o">&gt;</span><span class="nt">Custom</span> <span class="nt">jQuery</span> <span class="nt">Tabs</span><span class="o">&lt;/</span><span class="nt">title</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nt">script</span> <span class="nt">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span> <span class="nt">src</span><span class="o">=</span><span class="s2">&quot;assets/js/jquery-1.9.0.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="nt">script</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nt">script</span> <span class="nt">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span> <span class="nt">src</span><span class="o">=</span><span class="s2">&quot;assets/js/jquery-ui-1.10.0.custom.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="nt">script</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nt">link</span> <span class="nt">rel</span><span class="o">=</span><span class="s2">&quot;stylesheet&quot;</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;assets/css/jquery-ui-1.10.0.custom.min.css&quot;</span> <span class="nt">type</span><span class="o">=</span><span class="s2">&quot;text/css&quot;</span><span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nt">link</span> <span class="nt">rel</span><span class="o">=</span><span class="s2">&quot;stylesheet&quot;</span> <span class="nt">type</span><span class="o">=</span><span class="s2">&quot;text/css&quot;</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;style.css&quot;</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;/</span><span class="nt">head</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nt">body</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;tabsWithStyle&quot;</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;style-tabs&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">ul</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#facebook&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon facebook-icon&quot;</span><span class="o">&gt;</span><span class="nt">Facebook</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#twitter&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon twitter-icon&quot;</span><span class="o">&gt;</span><span class="nt">Twitter</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#linkedin&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon linkedin-icon&quot;</span><span class="o">&gt;</span><span class="nt">LinkedIn</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#google&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon google-icon&quot;</span><span class="o">&gt;</span><span class="nt">GooglePlus</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#wikipedia&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon wikipedia-icon&quot;</span><span class="o">&gt;</span><span class="nt">Wikipedia</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="o">&lt;</span><span class="nt">li</span><span class="o">&gt;&lt;</span><span class="nt">a</span> <span class="nt">href</span><span class="o">=</span><span class="s2">&quot;#picasa&quot;</span><span class="o">&gt;&lt;</span><span class="nt">div</span> <span class="nt">class</span><span class="o">=</span><span class="s2">&quot;icon picasa-icon&quot;</span><span class="o">&gt;</span><span class="nt">Picasa</span><span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;&lt;/</span><span class="nt">a</span><span class="o">&gt;&lt;/</span><span class="nt">li</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">ul</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;facebook&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">Facebook</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;twitter&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">Twitter</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;linkedin&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">LinkedIn</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;google&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">Google</span> <span class="nt">Plus</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;wikipedia&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">Wikipedia</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="nt">div</span> <span class="nt">id</span><span class="o">=</span><span class="s2">&quot;picasa&quot;</span><span class="o">&gt;</span>
</span><span class='line'>              <span class="nt">content</span> <span class="nt">about</span> <span class="nt">Picasa</span> <span class="nt">here</span>
</span><span class='line'>          <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;/</span><span class="nt">div</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nt">script</span> <span class="nt">type</span><span class="o">=</span><span class="s2">&quot;text/javascript&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="err">$</span><span class="o">(</span><span class="nt">function</span><span class="o">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="err">$</span><span class="p">(</span><span class="s1">&#39;#tabsWithStyle&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tabs</span><span class="p">();</span>
</span><span class='line'>          <span class="p">}</span><span class="o">);</span>
</span><span class='line'>      <span class="o">&lt;/</span><span class="nt">script</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;/</span><span class="nt">body</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;/</span><span class="nt">html</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Demo &amp; Download</h2>

<ul>
<li>You can find a demo on the top of this article.</li>
<li><a href="../code/style-your-jquery-ui-tabs/style-your-jquery-ui-tabs.zip" target="_blank">You can download the code here</a>.</li>
</ul>


<p>That&#8217;s all! have fun and don&#8217;t hesitate to leave your comment!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Cascading Autocompletes using jQuery UI]]></title>
    <link href="http://webdeveasy.com/cascading-autocompletes-using-jquery-ui/"/>
    <updated>2012-09-14T18:34:42+03:00</updated>
    <id>http://webdeveasy.com/cascading-autocompletes-using-jquery-ui</id>
    <content type="html"><![CDATA[<p>Yesterday I got a new requirement for the application I am working on.
I had several <a href="http://jqueryui.com/demos/autocomplete" target="_blank">jQuery UI autocompletes</a> and I needed to add cascading functionality. This means that each autocomplete in the group affects the following autocomple&#8217;s possible values. If there is no value selected in the first autocomplete - the next autocomplete must be disabled. When the user selects a value on the first autocomplete - the next autocomplete becomes enabled.</p>

<!-- more -->


<p>After searching the web I realized that the best option for me is to write my own jQuery plugin that manages the autocompletes cascading.
The plugin gets as input a sequence of jQuery UI auocomplete elements and adds the cascading functionality. The idea under my plugin is to override each autocomplete&#8217;s change and select events, and enable or disable the next autocomplete in the sequence according to the selected value.</p>

<p>Here is the code:</p>

<figure class='code'><figcaption><span>Cascading Autocompletes plugin</span> <a href='http://webdeveasy.com/code/cascading-autocompletes-plugin/jquery.cascading-autocompletes.js' target='_blank'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">activateChild</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">child</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">child</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="s2">&quot;disabled&quot;</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s2">&quot;disabled&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">child</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;enable&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">deactivateChild</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">child</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">child</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="s2">&quot;disabled&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">val</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">&quot;disabled&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">child</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;disable&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">subChild</span> <span class="o">=</span> <span class="nx">child</span><span class="p">.</span><span class="nx">data</span><span class="p">(</span><span class="s2">&quot;cascade-child&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">subChild</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">deactivateChild</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">subChild</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">eventOverride</span><span class="p">(</span><span class="nx">originalEvent</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">child</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">ui</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">isChildActivate</span> <span class="o">=</span> <span class="nx">child</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="s2">&quot;disabled&quot;</span><span class="p">)</span> <span class="o">===</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ui</span><span class="p">.</span><span class="nx">item</span> <span class="o">&amp;&amp;</span> <span class="nx">isChildActivate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">deactivateChild</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">ui</span><span class="p">.</span><span class="nx">item</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">isChildActivate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">activateChild</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">originalEvent</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">originalEvent</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">,</span> <span class="nx">event</span><span class="p">,</span> <span class="nx">ui</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">cascade</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">child</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">parent</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">child</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">child</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">parent</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">originalChange</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;option&quot;</span><span class="p">,</span> <span class="s2">&quot;change&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">originalSelect</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;option&quot;</span><span class="p">,</span> <span class="s2">&quot;select&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">parent</span><span class="p">.</span><span class="nx">data</span><span class="p">(</span><span class="s2">&quot;cascade-child&quot;</span><span class="p">,</span> <span class="nx">child</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">parent</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;option&quot;</span><span class="p">,</span> <span class="s2">&quot;change&quot;</span><span class="p">,</span> <span class="nx">eventOverride</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">,</span> <span class="nx">originalChange</span><span class="p">));</span>
</span><span class='line'>            <span class="nx">parent</span><span class="p">.</span><span class="nx">autocomplete</span><span class="p">(</span><span class="s2">&quot;option&quot;</span><span class="p">,</span> <span class="s2">&quot;select&quot;</span><span class="p">,</span> <span class="nx">eventOverride</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">,</span> <span class="nx">originalSelect</span><span class="p">));</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">deactivateChild</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">child</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">parent</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">cascadingAutocompletes</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">autocompletes</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">autocompletes</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">autocompletes</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">$</span><span class="p">(</span><span class="nx">autocompletes</span><span class="p">[</span><span class="nx">i</span><span class="p">]).</span><span class="nx">cascade</span><span class="p">(</span><span class="nx">autocompletes</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Usage example:</p>

<figure class='code'><figcaption><span>Cascading Autocompletes plugin Usage</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">cascadingAutocompletes</span><span class="p">([</span><span class="s2">&quot;#country&quot;</span><span class="p">,</span> <span class="s2">&quot;#city&quot;</span><span class="p">,</span> <span class="s2">&quot;#street&quot;</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Demo &amp; Download</h2>

<ul>
<li><a href="http://webdeveasy.com/code/cascading-autocompletes-plugin/index.html" target="_blank">Demo Here</a>.</li>
<li><a href="http://webdeveasy.com/code/cascading-autocompletes-plugin/cascading-autocompletes-plugin.zip" target="_blank">Download code here</a>.</li>
</ul>


<p>Hope this helps!</p>
]]></content>
  </entry>
  
</feed>