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

  <title><![CDATA[Ember Ashes]]></title>
  <link href="http://emberashes.com/atom.xml" rel="self"/>
  <link href="http://emberashes.com/"/>
  <updated>2013-05-28T21:03:56-04:00</updated>
  <id>http://emberashes.com/</id>
  <author>
    <name><![CDATA[Max Minkoff & Mike Nicholaides]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Intro to Ember.js]]></title>
    <link href="http://emberashes.com/blog/2013/02/13/intro-to-ember/"/>
    <updated>2013-02-13T19:29:00-05:00</updated>
    <id>http://emberashes.com/blog/2013/02/13/intro-to-ember</id>
    <content type="html"><![CDATA[<p>Max Minkoff presented the following at our local Ember.js meetup, <a href="http://www.meetup.com/Emberjs-Philly/">Ember.js Philly</a>, on Jan 31st, 2013.</p>

<iframe src="http://www.slideshare.net/slideshow/embed_code/16516116" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe>


<p> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/MikeNicholaides/intro-to-emberjs" title="Introduction to Ember.js" target="_blank">Introduction to Ember.js</a> </strong> from <strong><a href="http://www.slideshare.net/MikeNicholaides" target="_blank">Mike Nicholaides</a></strong> </div></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getters and Setters in Ember.js]]></title>
    <link href="http://emberashes.com/blog/2012/12/23/getters-and-setters-in-ember-dot-js/"/>
    <updated>2012-12-23T20:21:00-05:00</updated>
    <id>http://emberashes.com/blog/2012/12/23/getters-and-setters-in-ember-dot-js</id>
    <content type="html"><![CDATA[<div style="display:block; background-color:#fff">
  <img src='http://emberjs.com/images/community/outdated.png' style="float:left;">
  <p style="margin-left:115px; font-color:#1e1e1e;">
    <em>Hey!</em> This article references a pre-release version of Ember.js. Now that Ember.js has reached a 1.0 API the code samples below are no longer correct and the expressed opinions <em>may</em> no longer be accurate.
  </p>
</div>


<p>Computed properties are the cornerstone of data binding in Ember.js. If you&#8217;ve written any code for Ember you&#8217;ve probably written your fair share of them. They tend to look something like this:</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="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">Em</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">fullName</span><span class="o">:</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="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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;lastName&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}).</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The preceding property is a &#8220;getter&#8221;. That is, it can only retrieve a value. If you try to set the <code>fullName</code> property it will be ignored. Observe:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">firstName</span><span class="o">:</span> <span class="s1">&#39;John&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">lastName</span><span class="o">:</span> <span class="s1">&#39;Stamos&#39;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">);</span> <span class="c1">// =&gt; &quot;John Stamos&quot;</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">,</span> <span class="s1">&#39;Danny Tanner&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">);</span> <span class="c1">// =&gt; &quot;John Stamos&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is where &#8220;setters&#8221; come in. Setters let us set a computed property and provide logic to handle, manipulate, or deal with the input.</p>

<p>Let&#8217;s make a getter+setter (AKA &#8220;accessor&#8221;) for our <code>fullName</code> property. This property handles both getting and setting.</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="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">Em</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">fullName</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">fullNameString</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">arguments</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 class="c1">// get</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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;lastName&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">//set</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">nameParts</span> <span class="o">=</span> <span class="nx">fullNameString</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="sr">/\s+/</span><span class="p">);</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="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="nx">nameParts</span><span class="p">[</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">set</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">,</span>  <span class="nx">nameParts</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="nx">fullNameString</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s look this piece by piece.</p>

<h2>Get or set?</h2>

<p>The first part to notice is this:</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">fullName</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">fullNameString</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">arguments</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 class="c1">// get</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>                      <span class="c1">// set</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Getting</strong>: When we call <code>user.get('fullName')</code>, the property is called with <code>key</code> as <code>'fullName'</code> and no <code>fullNameString</code> argument.</p>

<p><strong>Setting</strong>: When we call <code>user.set('fullName', 'John Stamos')</code>, the property is called with <code>key</code> as <code>'fullName'</code> and <code>fullNameString</code> as <code>'John Stamos'</code>.</p>

<p>In other words, when <code>arguments.length === 1</code>, it should act as a getter, and when <code>arguments.length === 2</code>, it should act as a setter.</p>

<h2>The Getter</h2>

<p>When this function is being called as a getter, it behaves just like normal computed properties. This line from the getter section is the same as in my first example of a normal computed property:</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="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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;lastName&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Whatever we return here is what we get when we call <code>user.get('fullName')</code>.</p>

<p>Just like normal computed properties, we need to keep this line, too:</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="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>The Setter</h2>

<p>Here are the relevant sections of the setter portion of our property:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">fullName</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">fullNameString</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">arguments</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 class="c1">// get</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// set</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">nameParts</span> <span class="o">=</span> <span class="nx">fullNameString</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="sr">/\s+/</span><span class="p">);</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="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="nx">nameParts</span><span class="p">[</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">set</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">,</span>  <span class="nx">nameParts</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">fullNameString</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, as you might expect, we split a given full name into first and last name and then set the <code>firstName</code> and <code>lastName</code> properties:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">nameParts</span> <span class="o">=</span> <span class="nx">fullNameString</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="sr">/\s+/</span><span class="p">);</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="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="nx">nameParts</span><span class="p">[</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">set</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">,</span>  <span class="nx">nameParts</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, we return the value that we want to be cached as the <code>fullName</code> property&#8217;s value:</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="k">return</span> <span class="nx">fullNameString</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the most surprising part so I&#8217;ll repeat it: <strong>whatever is returned from the setter is cached as the property&#8217;s value</strong>. One must be careful to return the right value.</p>

<p>And, that&#8217;s all there is to know about getters and setters in Ember.js. Or, at least on a surface level.</p>

<h2>ur doin it wrong</h2>

<p>The above structure for a getter+setter property is standard and is what the Ember.js documentation prescribes. But, it has a fatal flaw as the following example will demonstrate.</p>

<p>What if the <code>firstName</code> property is also a getter+setter? Let&#8217;s say, as a contrived example, that because of some new regulatory legislation we are not legally allowed to collect first names, only first initials. We might make our <code>firstName</code> property look like this:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">firstName</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">firstNameStr</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">arguments</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 class="c1">// get</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;_firstInitial&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// set</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">firstInitial</span> <span class="o">=</span> <span class="nx">firstNameStr</span><span class="p">[</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">set</span><span class="p">(</span><span class="s1">&#39;_firstInitial&#39;</span><span class="p">,</span> <span class="nx">firstInitial</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">firstInitial</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;_firstInitial&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This property works like this:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;John&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">);</span> <span class="c1">// =&gt; &#39;J&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s look at how the <code>fullName</code> property behaves when we introduce this change.</p>

<p>This use case works fine:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">setProperties</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">firstName</span><span class="o">:</span> <span class="s1">&#39;John&#39;</span>
</span><span class='line'>  <span class="nx">lastName</span><span class="o">:</span>  <span class="s1">&#39;Stamos&#39;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">);</span> <span class="c1">// =&gt; &#39;J Stamos&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This one&#8230; not so much:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">,</span> <span class="s1">&#39;John Stamos&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">);</span> <span class="c1">// =&gt; &#39;J&#39;</span>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">);</span>  <span class="c1">// =&gt; &#39;Stamos&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;fullName&#39;</span><span class="p">);</span>  <span class="c1">// =&gt; &#39;John Stamos&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Uh oh. Did you catch it? The <code>fullName</code> property should be returning <code>'J Stamos'</code>, not <code>'John Stamos'</code>.  The problem is that the <code>fullName</code> property assumed how the <code>firstName</code> property would handle its input.</p>

<p>Instead, I advocate that each property mind its own business. <code>fullName</code> should allow <code>firstName</code> to handle its own input (and caching).</p>

<h2>A better way</h2>

<p>Here&#8217;s a version of the <code>fullName</code> property that keeps to itself and thus works correctly:</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">fullName</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">fullNameString</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">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// set</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">nameParts</span> <span class="o">=</span> <span class="nx">fullNameString</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="sr">/\s+/</span><span class="p">);</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="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="nx">nameParts</span><span class="p">[</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">set</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">,</span>  <span class="nx">nameParts</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><span class='line'>  <span class="c1">// get and set</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</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;lastName&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the property is called as a getter (i.e., with one argument), it works the same way it always had.</p>

<p>When the property is called setter, it sets the properties it needs to but doesn&#8217;t just return <code>fullNameString</code> like the previous version did. Instead, it allows the getter logic to run, which honors <code>firstName</code>&#8217;s and <code>lastName</code>&#8217;s decisions about how they should handle being set.</p>

<p>Not only is this version more correct, it is shorter and more DRY.</p>

<h2>Conclusion</h2>

<p>Getters and setters are an important part of data binding in Ember.js. Unfortunately,  they can be confusing if you haven&#8217;t experimented a lot and read the source, which you shouldn&#8217;t have to do.</p>

<p>Ember.js is a young technology and presents a paradigm that&#8217;s new for most of us.  If you have other insights, techniques, best practices, or critiques, I&#8217;d love to hear them.</p>
]]></content>
  </entry>
  
</feed>
