<?xml version="1.0"?>
<News hasArchived="true" page="8091" pageCount="10741" pageSize="10" timestamp="Wed, 05 Aug 2026 08:53:02 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8091">
<NewsItem contentIssues="true" id="38083" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38083">
<Title>E-Cycling Event - Celebrate America Recycles Day! Wed. 11/20</Title>
<Tagline>Bring your unused electronics to campus 7:30 a.m. to 1:p.m.</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <p>UMBC Celebrates America Recycling Day on Wednesday November 20 from 7:30a.m. to 1p.m. at the Commons south entrance on Commons Circle. NOTE : <em><strong>University owned equipment must be accompanied with signed disposition forms  and will be accepted only after 10a.m.</strong></em> **<span><span><strong>Please No Refrigerators** </strong></span></span></p>
    <p>Electronic Recycling - what can I recycle ?- any thing that runs on batteries or plugs in</p>
    <li><span>Computers <span>      </span><span>   </span></span></li>
    <li><span>PC’s,</span></li>
    <li><span>Apple</span></li>
    <li><span>Telephone</span></li>
    <li><span>Systems</span></li>
    <li><span>Scanners</span></li>
    <li><span>Terminals</span></li>
    <li><span>Printers</span></li>
    <li><span>Facsimiles</span></li>
    <li><span>Circuit Boards</span></li>
    <li><span>Key board</span></li>
    <li><span>Mainframes</span></li>
    <li><span>Monitors</span></li>
    <li><span>POS Systems </span></li>
    <li><span>Microwaves </span></li>
    <li><span>Copiers</span></li>
    <li><span>Test Equipment </span></li>
    <li><span>Typewriters</span></li>
    <li><span>A/V Equipment<span>  </span></span></li>
    <li><span>Radios </span></li>
    <li><span>Stereos</span></li>
    <li><span>Speakers</span></li>
    <li><span>Networking Equipment </span></li>
    <li><span>Cables /Cords </span></li>
    <li><span>Cell Phones </span></li>
    <li><span>Hard Drives </span></li>
    <p><span>Televisions</span></p>
    <strong><em><u><span><div><li><span></span></li></div></span><div><p> </p></div></u><p> </p>
    <div><p> </p></div></em><div><p> </p></div></strong><div>
    <p> </p>
    <strong><em><u></u></em></strong>
    </div>
    </div>
]]>
</Body>
<Summary>UMBC Celebrates America Recycling Day on Wednesday November 20 from 7:30a.m. to 1p.m. at the Commons south entrance on Commons Circle. NOTE : University owned equipment must be accompanied with...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38083/guest@my.umbc.edu/2de53380b4c8a5ef7ec262432ca22239/api/pixel</TrackingUrl>
<Tag>inventory</Tag>
<Tag>recycling</Tag>
<Tag>sustainability</Tag>
<Group token="retired-401">ReSET- Retriever Recycling team </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-401</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/xsmall.png?1337614255</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/original.jpg?1337614255</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/xxlarge.png?1337614255</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/xlarge.png?1337614255</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/large.png?1337614255</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/medium.png?1337614255</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/small.png?1337614255</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/xsmall.png?1337614255</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/401/cd50a6640d6284992905dc447fd7701d/xxsmall.png?1337614255</AvatarUrl>
<Sponsor>ReCET- Retriever Recycling team</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/xxlarge.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/xlarge.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/large.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/medium.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/small.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/xsmall.jpg?1383832729</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/038/083/ce518001633ca4e1f2ae4b02f4dcb11f/xxsmall.jpg?1383832729</ThumbnailUrl>
<PawCount>2</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 09:03:21 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38085" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38085">
<Title>DealBook: Opening With a Pop, Key Moments From Twitter&#8217;s First Day of Trading</Title>
<Body>
<![CDATA[
    <div class="html-content">Twitter closed at $44.90 a share, 73 percent above its initial public offering price. DealBook followed the first day of trading as it unfolded.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fdealbook.nytimes.com%2F2013%2F11%2F07%2Flive-blog-tracking-twitters-i-p-o%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=DealBook%3A+Opening+With+a+Pop%2C+Key+Moments+From+Twitter%E2%80%99s+First+Day+of+Trading" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fdealbook.nytimes.com%2F2013%2F11%2F07%2Flive-blog-tracking-twitters-i-p-o%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=DealBook%3A+Opening+With+a+Pop%2C+Key+Moments+From+Twitter%E2%80%99s+First+Day+of+Trading" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fdealbook.nytimes.com%2F2013%2F11%2F07%2Flive-blog-tracking-twitters-i-p-o%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=DealBook%3A+Opening+With+a+Pop%2C+Key+Moments+From+Twitter%E2%80%99s+First+Day+of+Trading" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fdealbook.nytimes.com%2F2013%2F11%2F07%2Flive-blog-tracking-twitters-i-p-o%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=DealBook%3A+Opening+With+a+Pop%2C+Key+Moments+From+Twitter%E2%80%99s+First+Day+of+Trading" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fdealbook.nytimes.com%2F2013%2F11%2F07%2Flive-blog-tracking-twitters-i-p-o%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=DealBook%3A+Opening+With+a+Pop%2C+Key+Moments+From+Twitter%E2%80%99s+First+Day+of+Trading" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/sc/21/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180263704244/u/0/f/640387/c/34625/s/3369c2c8/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Twitter closed at $44.90 a share, 73 percent above its initial public offering price. DealBook followed the first day of trading as it unfolded.      </Summary>
<Website>http://dealbook.nytimes.com/2013/11/07/live-blog-tracking-twitters-i-p-o/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38085/guest@my.umbc.edu/b574ba54df0c2d66c51b4639b5240791/api/pixel</TrackingUrl>
<Tag>i-p-o-offerings</Tag>
<Tag>new</Tag>
<Tag>technology</Tag>
<Tag>top-headline-1</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 08:50:23 -0500</PostedAt>
<EditAt>Thu, 07 Nov 2013 16:46:49 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="38093" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38093">
<Title>Tracking the Twitter I.P.O.</Title>
<Body>
<![CDATA[
    <div class="html-content">Twitter begins life as a public company on Thursday, and DealBook will be following the first day of trading as it happens.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2Findex.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tracking+the+Twitter+I.P.O." rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2Findex.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tracking+the+Twitter+I.P.O." rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2Findex.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tracking+the+Twitter+I.P.O." rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2Findex.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tracking+the+Twitter+I.P.O." rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2Findex.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Tracking+the+Twitter+I.P.O." rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>Twitter begins life as a public company on Thursday, and DealBook will be following the first day of trading as it happens.      </Summary>
<Website>http://www.nytimes.com/index.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38093/guest@my.umbc.edu/7b8ca48a1bed35512ed0b2ae0cc65e5f/api/pixel</TrackingUrl>
<Tag>new</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 08:42:27 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38082" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38082">
<Title>An In-Depth Introduction To Ember.js</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <table width="650">
    <tbody>
    <tr>
    <td>
    <div>
    <img src="http://statisches.auslieferung.commindo-media-ressourcen.de/advertisement.gif" alt="" style="max-width: 100%; height: auto;"><br><a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=1" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=1" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=2" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=2" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=3" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=3" alt="" style="max-width: 100%; height: auto;"></a>
    </div>
    </td>
    </tr>
    </tbody>
    </table>
    <p>With the release of Ember.js 1.0, it’s just about time to consider giving it a try. This article aims to introduce Ember.js to newcomers who want to learn about this framework.</p>
    <p>Users often say that the learning curve is steep, but once you’ve overcome the difficulties, then Ember.js is tremendous. This happened to me as well. While the <a href="http://emberjs.com/guides/" rel="nofollow external" class="bo">official guides</a> are more accurate and up to date than ever (for real!), this post is my attempt to make things even smoother for beginners.</p>
    <p>First, we will clarify the main concepts of the framework. Next, we’ll go in depth with a step-by-step tutorial that teaches you how to build a simple Web app with Ember.js and Ember-Data, which is Ember’s data storage layer. Then, we will see how <code>views</code> and <code>components</code> help with handling user interactions. Finally, we will dig a little more into Ember-Data and template precompiling.</p>
    <p><img src="http://media.smashingmagazine.com/wp-content/uploads/2013/11/emberjs-logo.png" width="500" height="406" alt="An In-Depth Introduction To Ember.js" style="max-width: 100%; height: auto;"><br><em>Ember’s famous little mascot, Tomster. (<a href="http://emberjs.com/" rel="nofollow external" class="bo">Image credits</a>)</em></p>
    <p>The <strong>unstyled demo below</strong> will help you follow each step of the tutorial. The <strong>enhanced demo </strong>is basically the same but with a lot more CSS and animations and a fully responsive UX when displayed on small screens.</p>
    <p><a href="http://jkneb.github.io/ember-crud/unstyled" rel="nofollow external" class="bo">Unstyled demo</a> <a href="https://github.com/jkneb/ember-crud" rel="nofollow external" class="bo">Source code</a> <a href="http://jkneb.github.io/ember-crud" rel="nofollow external" class="bo">Enhanced demo</a></p>
    <h4>Table of Contents</h4>
    <ul>
    <li><a href="#main_concepts" rel="nofollow external" class="bo">Definitions of main concepts</a></li>
    <li>
    <a href="#lets_build_an_app" rel="nofollow external" class="bo">Let’s build a simple CRUD</a>
    <ul>
    <li><a href="#sketch_our_app" rel="nofollow external" class="bo">Sketch our app</a></li>
    <li><a href="#what_you_need_to_get_started" rel="nofollow external" class="bo">What you’ll need to get started</a></li>
    <li><a href="#set_up_our_files_structure" rel="nofollow external" class="bo">Our files directory structure</a></li>
    <li><a href="#precompile_templates_or_not" rel="nofollow external" class="bo">Precompile templates or not?</a></li>
    <li><a href="#set_up_the_model_with_ember_data_fixtureadapter" rel="nofollow external" class="bo">Set up the model with Ember-Data’s FixtureAdapter</a></li>
    <li><a href="#instantiate_the_router" rel="nofollow external" class="bo">Instantiate the router</a></li>
    <li><a href="#the_application_template" rel="nofollow external" class="bo">The application template</a></li>
    <li><a href="#the_users_route" rel="nofollow external" class="bo">The users route</a></li>
    <li><a href="#object_vs_array_controller" rel="nofollow external" class="bo">Object vs. array controller</a></li>
    <li><a href="#displaying_the_number_of_users" rel="nofollow external" class="bo">Displaying the number of users</a></li>
    <li><a href="#computed_properties" rel="nofollow external" class="bo">Computed properties</a></li>
    <li><a href="#redirecting_from_the_index_page" rel="nofollow external" class="bo">Redirecting from the index page</a></li>
    <li><a href="#single_user_route" rel="nofollow external" class="bo">Single user route</a></li>
    <li><a href="#edit_a_user" rel="nofollow external" class="bo">Edit a user</a></li>
    <li><a href="#our_first_action" rel="nofollow external" class="bo">Our first action</a></li>
    <li><a href="#transitionTo_or_transitionToRoute" rel="nofollow external" class="bo">TransitionTo or TransitionToRoute?</a></li>
    <li><a href="#saving_user_modifications" rel="nofollow external" class="bo">Saving user modifications</a></li>
    <li><a href="#delete_a_user" rel="nofollow external" class="bo">Delete a user</a></li>
    <li><a href="#create_a_user" rel="nofollow external" class="bo">Create a user</a></li>
    <li><a href="#format_data_with_helpers" rel="nofollow external" class="bo">Format data with helpers</a></li>
    <li><a href="#format_data_with_bound_helpers" rel="nofollow external" class="bo">Format data with bound helpers</a></li>
    <li><a href="#switch_to_the_localstorage_adapter" rel="nofollow external" class="bo">Switch to the LocalStorage adapter</a></li>
    </ul>
    </li>
    <li>
    <a href="#playing_with_views" rel="nofollow external" class="bo">Playing with views</a>
    <ul>
    <li><a href="#jquery_and_the_didinsertelement" rel="nofollow external" class="bo">jQuery and the didInsertElement</a></li>
    <li><a href="#side_panel_components_with_classname_bindings" rel="nofollow external" class="bo">Side panel components with className bindings</a></li>
    <li><a href="#modals_with_layout_and_event_bubbling" rel="nofollow external" class="bo">Modals with layout and event bubbling</a></li>
    </ul>
    </li>
    <li>
    <a href="#what_is_ember_data" rel="nofollow external" class="bo">What is Ember-Data</a>
    <ul>
    <li><a href="#the_store" rel="nofollow external" class="bo">The store</a></li>
    <li><a href="#adapters" rel="nofollow external" class="bo">Adapters</a></li>
    <li><a href="#what_about_not_using_emberdata" rel="nofollow external" class="bo">What about not using Ember-Data?</a></li>
    </ul>
    </li>
    <li>
    <a href="#what_is_handlebars_template_precompiling" rel="nofollow external" class="bo">What is Handlebars template precompiling?</a>
    <ul>
    <li><a href="#templates_naming_conventions" rel="nofollow external" class="bo">Template naming conventions</a></li>
    <li><a href="#precompiling_with_grunt" rel="nofollow external" class="bo">Precompiling with Grunt</a></li>
    <li><a href="#precompiling_with_rails" rel="nofollow external" class="bo">Precompiling with Rails</a></li>
    </ul>
    </li>
    <li><a href="#conclusion" rel="nofollow external" class="bo">Conclusion</a></li>
    <ul>
    <li><a href="#tools_tips_resources" rel="nofollow external" class="bo">Tools, tips and resources</a></li>
    <li><a href="#acknowledgments" rel="nofollow external" class="bo">Acknowledgments</a></li>
    </ul>
    
    </ul>
    <h3>Definitions Of Main Concepts</h3>
    <p>The diagram below illustrates how routes, controllers, views, templates and models interact with each other.</p>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/09/ember-sketch.png" rel="nofollow external" class="bo"><img alt="ember-sketch" src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/ember-sketch.png" width="500" height="482" style="max-width: 100%; height: auto;"></a></p>
    <p>Let’s define these concepts. And if you’d like to learn more, check the relevant section of the official guides:</p>
    <ul>
    <li><a href="http://emberjs.com/guides/models" rel="nofollow external" class="bo">Models</a></li>
    <li><a href="http://emberjs.com/guides/routing" rel="nofollow external" class="bo">The Router</a></li>
    <li><a href="http://emberjs.com/guides/controllers" rel="nofollow external" class="bo">Controllers</a></li>
    <li><a href="http://emberjs.com/guides/views" rel="nofollow external" class="bo">Views</a></li>
    <li><a href="http://emberjs.com/guides/components/" rel="nofollow external" class="bo">Components</a></li>
    <li><a href="http://emberjs.com/guides/templates/handlebars-basics" rel="nofollow external" class="bo">Templates</a></li>
    <li><a href="http://emberjs.com/guides/templates/writing-helpers" rel="nofollow external" class="bo">Helpers</a></li>
    </ul>
    <h4>Models</h4>
    <p>Suppose our application handles a collection of users. Well, those users and their informations would be the model. Think of them as the database data. Models may be retrieved and updated by implementing AJAX callbacks inside your routes, or you can rely on Ember-Data (a data-storage abstraction layer) to greatly simplify the retrieval, updating and persistence of models over a REST API.</p>
    <h4>The Router</h4>
    <p>There is the <code>Router</code>, and then there are routes. The <code>Router</code> is just a synopsis of all of your routes. Routes are the URL representations of your application’s objects (for example, a route’s <code>posts</code> will render a collections of posts). The goal of routes is to query the model, from their <code>model</code> hook, to make it available in the controller and in the template. Routes can also be used to set properties in controllers, to execute events and actions, and to connect a particular template to a particular controller. Last but not least, the <code>model</code> hook can return promises so that you can implement a <code>LoadingRoute</code>, which will wait for the model to resolve asynchronously over the network.</p>
    <h4>Controllers</h4>
    <p>At first, a <code>controller</code> gets a model from a <code>route</code>. Then, it makes the bridge between the model and the view or template. Let’s say you need a convenient method or function for switching between editing mode to normal mode. A method such as <code>goIntoEditMode()</code> and <code>closeEditMode()</code> would be perfect, and that’s exactly what controllers can be used for.</p>
    <p>Controllers are auto-generated by Ember.js if you don’t declare them. For example, you can create a <code>user</code> template with a <code>UserRoute</code>; and, if you don’t create a <code>UserController</code> (because you have nothing special to do with it), then Ember.js will generate one for you internally (in memory). The <a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi" rel="nofollow external" class="bo">Ember Inspector</a> extension for Chrome can help you track those magic controllers.</p>
    <h4>Views</h4>
    <p>Views represent particular parts of your application (the visual parts that the user can see in the browser). A <code>View</code> is associated with a <code>Controller</code>, a Handlebars <code>template</code> and a <code>Route</code>. The difference between views and templates can be tricky. You will find yourself dealing with views when you want to handle events or handle some custom interactions that are impossible to manage from templates. They have a very convenient <code>didInsertElement</code> hook, through which you can play with jQuery very easily. Furthermore, they become extremely useful when you need to build reusable views, such as modals, popovers, date-pickers and autocomplete fields.</p>
    <h4>Components</h4>
    <p>A <code>Component</code> is a completely isolated <code>View</code> that has no access to the surrounding context. It’s a great way to build reusable components for your apps. A <a href="http://jsbin.com/OMOgUzo/1/edit?html,js,output" rel="nofollow external" class="bo">Twitter Button</a>, a custom <a href="http://pixelhandler.com/blog/2013/08/25/create-a-custom-select-box-using-ember-component/" rel="nofollow external" class="bo">select box</a> and those <a href="http://jsbin.com/odosoy/132/edit?html,js,output" rel="nofollow external" class="bo">reusable charts</a> are all great examples of components. In fact, they’re such a great idea that the W3C is actually working with the Ember team on a <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html" rel="nofollow external" class="bo">custom element</a> specification.</p>
    <h4>Templates</h4>
    <p>Simply put, a template is the view’s HTML markup. It prints the model data and automatically updates itself when the model changes. Ember.js uses <a href="http://handlebarsjs.com" rel="nofollow external" class="bo">Handlebars</a>, a lightweight templating engine also maintained by the Ember team. It has the usual templating logic, like <code>if</code> and <code>else</code>, loops and formatting <code>helpers</code>, that kind of stuff. Templates may be precompiled (if you want to cleanly organize them as separate <code>.hbs</code> or <code>.handlebars</code> files) or directly written in <code>&lt;script type="text/x-handlebars"&gt;&lt;script&gt;</code> tags in your HTML page. Jump to the section on <a href="#what_is_handlebars_template_precompiling" rel="nofollow external" class="bo">templates precompiling</a> to dig into the subject.</p>
    <h4>Helpers</h4>
    <p>Handlebars helpers are functions that modify data before it is rendered on the screen — for example, to format dates better than <code>Mon Jul 29 2013 13:37:39 GMT+0200 (CEST)</code>. In your template, the date could be written as <code>{{date}}</code>. Let’s say you have a <code>formateDate</code> helper (which converts dates into something more elegant, like “One month ago” or “29 July 2013”). In this case, you could use it like so: <code>{{formateDate date}}</code>.</p>
    <h4>Components? Helpers? Views? HELP!</h4>
    <p>The Ember.js forum <a href="http://discuss.emberjs.com/t/whats-the-difference-between-ember-helpers-components-and-views/2201/2" rel="nofollow external" class="bo">has an answer</a> and StackOverflow <a href="http://stackoverflow.com/questions/18593424/views-vs-components-in-ember-js" rel="nofollow external" class="bo">has a response</a> that should alleviate your headache.</p>
    <h3>Let’s Build An App</h3>
    <p>In this section, we’ll build a real app, a simple interface for managing a group of users (a <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" rel="nofollow external" class="bo">CRUD</a> app). Here’s what we’ll do:</p>
    <ul>
    <li>look at the architecture we’re aiming for;</li>
    <li>get you started with the dependencies, files structure, etc.;</li>
    <li>set up the model with Ember-Data’s <code>FixtureAdapter</code>;</li>
    <li>see how routes, controllers, views and templates interact with each other;</li>
    <li>finally, replace the <code>FixtureAdapter</code> with the <code>LSAdapter</code> to persist data in the browser’s local storage.</li>
    </ul>
    <h4>Sketch Our App</h4>
    <p>We need a basic view to render a group of users (see 1 below). We need a single-user view to see its data (2). We need to be able to edit and delete a given user’s data (3). Finally, we need a way to create a new user; for this, we will reuse the edit form.</p>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/09/app-sketch.png" rel="nofollow external" class="bo"><img alt="app-sketch" src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/app-sketch.png" width="800" height="560" style="max-width: 100%; height: auto;"></a></p>
    <p>Ember.js strongly relies on naming conventions. So, if you want the page <code>/foo</code> in your app, you will have the following:</p>
    <ul>
    <li>a <code>foo</code> template,</li>
    <li>a <code>FooRoute</code>,</li>
    <li>a <code>FooController</code>,</li>
    <li>and a <code>FooView</code>.</li>
    </ul>
    <p>Learn more about <a href="http://emberjs.com/guides/concepts/naming-conventions" rel="nofollow external" class="bo">Ember’s naming conventions</a> in the guides.</p>
    <h4>What You’ll Need to Get Started</h4>
    <p>You will need:</p>
    <ul>
    <li>jQuery,</li>
    <li>Ember.js itself (obviously),</li>
    <li>Handlebars (i.e. Ember’s templating engine),</li>
    <li>Ember-Data (i.e. Ember’s data-persistence abstraction layer).</li>
    </ul>
    <pre><code>&#x000A;    /* /index.html&#x000A;    */&#x000A;     …&#x000A;     &lt;script src="//code.jquery.com/jquery-2.0.3.min.js"&gt;&lt;/script&gt;&#x000A;     &lt;script src="//builds.emberjs.com/handlebars-1.0.0.js"&gt;&lt;/script&gt;&#x000A;     &lt;script src="//builds.emberjs.com/tags/v1.1.2/ember.js"&gt;&lt;/script&gt;&#x000A;     &lt;script src="//builds.emberjs.com/tags/v1.0.0-beta.3/ember-data.js"&gt;&lt;/script&gt;&#x000A;     &lt;script&gt;&#x000A;       // your code&#x000A;     &lt;/script&gt;&#x000A;    &lt;/body&gt;&#x000A;    &lt;/html&gt;&#x000A;    </code></pre>
    <p>Ember’s website has a <a href="http://emberjs.com/builds" rel="nofollow external" class="bo">builds section</a>, where you can find all of the links for Ember.js and Ember-Data. Currently, Handlebars is not there; you will find it on the <a href="http://handlebarsjs.com" rel="nofollow external" class="bo">official Handlebars</a> website.</p>
    <p>Once we have loaded the required dependencies, we can get started building our app. First, we create a file named <code>app.js</code>, and then we initialize Ember:</p>
    <pre><code>&#x000A;    /* /app.js &#x000A;    */&#x000A;    window.App = Ember.Application.create();&#x000A;    </code></pre>
    <p>Just to be sure everything is OK, you should see Ember’s debugging logs in the browser’s console.</p>
    <p><img alt="console-log-1" src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/console-log-1.png" width="500" height="271" style="max-width: 100%; height: auto;"></p>
    <h4>Our Files Directory Structure</h4>
    <p>There’s not much of a convention on how to organize files and folders. The <a href="https://github.com/stefanpenner/ember-app-kit" rel="nofollow external" class="bo">Ember App Kit</a> (a Grunt-based environment to scaffold Ember apps) provides a kind of standard for this because it is maintained by the Ember team. Even simpler, you could put everything in a single <code>app.js</code> file. In the end, it’s really up to you.</p>
    <p>For this tutorial, we will simply put controllers in a <code>controller</code> folder, views in a <code>view</code> folder and so on.</p>
    <pre><code>&#x000A;    components/&#x000A;    controllers/&#x000A;    helpers/&#x000A;    models/&#x000A;    routes/&#x000A;    templates/&#x000A;    views/&#x000A;    app.js&#x000A;    router.js&#x000A;    store.js&#x000A;    </code></pre>
    <h4>Precompile Templates or Not?</h4>
    <p>There are two ways to declare templates. The easiest way is to add special <code>script</code> tags to your <code>index.html</code> file.</p>
    <pre><code>&#x000A;    &lt;script type="text/x-handlebars" id="templatename"&gt;&#x000A;      &lt;div&gt;I'm a template&lt;/div&gt;&#x000A;    &lt;/script&gt;&#x000A;    </code></pre>
    <p>Each time you need a template, you’d add another script tag for it. It’s fast and easy but can become a real mess if you have too many templates.</p>
    <p>The other way is to create an <code>.hbs</code> (or <code>.handlebars</code>) file for each of your templates. This is called “template precompiling,” and a <a href="#what_is_handlebars_template_precompiling" rel="nofollow external" class="bo">complete section</a> is dedicated to it later in this article.</p>
    <p>Our <a href="http://jkneb.github.io/ember-crud/unstyled" rel="nofollow external" class="bo">unstyled demo</a> uses <code>&lt;script type="text/x-handlebars"&gt;</code> tags, and all of the templates for our <a href="http://jkneb.github.io/ember-crud" rel="nofollow external" class="bo">enhanced demo</a> are stored in <code>.hbs</code> files, which are precompiled with a <a href="http://gruntjs.com" rel="nofollow external" class="bo">Grunt</a> task. This way, you can compare the two techniques.</p>
    <h4>Set Up the Model With Ember-Data’s FixtureAdapter</h4>
    <p>Ember-Data is a library that lets you retrieve records from a server, hold them in a <code>Store</code>, update them in the browser and, finally, save them back to the server. The <code>Store</code> can be configured with various adapters (for example, the <code>RESTAdapter</code> interacts with a JSON API, and the <code>LSAdapter</code> persists your data in the browser’s local storage). An <a href="#what_is_ember_data" rel="nofollow external" class="bo">entire section</a> is dedicated to Ember-Data later in this article.</p>
    <p>Here, we are going to use the <code>FixtureAdapter</code>. So, let’s instantiate it:</p>
    <pre><code>&#x000A;    /* /store.js &#x000A;    */&#x000A;    App.ApplicationAdapter = DS.FixtureAdapter;&#x000A;    </code></pre>
    <p>In previous versions of Ember, you had to subclass the <code>DS.Store</code>. We don’t need to do that anymore to instantiate adapters.</p>
    <p>The <code>FixtureAdapter</code> is a great way to start with Ember.js and Ember-Data. It lets you work with sample data in the development stage. At the end, we will switch to the <a href="https://github.com/rpflorence/ember-localstorage-adapter" rel="nofollow external" class="bo">LocalStorage adapter</a> (or <code>LSAdapter</code>).</p>
    <p>Let’s define our model. A user would have a <code>name</code>, an <code>email</code> address, a short <code>bio</code>, an <code>avatarUrl</code> and a <code>creationDate</code>.</p>
    <pre><code>&#x000A;    /* /models/user.js &#x000A;    */&#x000A;    App.User = DS.Model.extend({&#x000A;      name         : DS.attr(),&#x000A;      email        : DS.attr(),&#x000A;      bio          : DS.attr(),&#x000A;      avatarUrl    : DS.attr(),&#x000A;      creationDate : DS.attr()&#x000A;    });&#x000A;    </code></pre>
    <p>Now, let’s feed our <code>Store</code> with the sample data. Feel free to add as many users as you need:</p>
    <pre><code>&#x000A;    /* /models/user.js &#x000A;    */&#x000A;    App.User.FIXTURES = [{&#x000A;      id: 1,&#x000A;      name: 'Sponge Bob',&#x000A;      email: '<a href="mailto:bob@sponge.com">bob@sponge.com</a>',&#x000A;      bio: 'Lorem ispum dolor sit amet in voluptate fugiat nulla pariatur.',&#x000A;      avatarUrl: '<a href="http://jkneb.github.io/ember-crud/assets/images/avatars/sb.jpg">http://jkneb.github.io/ember-crud/assets/images/avatars/sb.jpg</a>',&#x000A;      creationDate: 'Mon, 26 Aug 2013 20:23:43 GMT'&#x000A;    }, {&#x000A;      id: 2,&#x000A;      name: 'John David',&#x000A;      email: '<a href="mailto:john@david.com">john@david.com</a>',&#x000A;      bio: 'Lorem ispum dolor sit amet in voluptate fugiat nulla pariatur.',&#x000A;      avatarUrl: '<a href="http://jkneb.github.io/ember-crud/assets/images/avatars/jk.jpg">http://jkneb.github.io/ember-crud/assets/images/avatars/jk.jpg</a>',&#x000A;      creationDate: 'Fri, 07 Aug 2013 10:10:10 GMT'&#x000A;    }&#x000A;    …&#x000A;    ];&#x000A;    </code></pre>
    <p>Learn more about <a href="http://emberjs.com/guides/models/" rel="nofollow external" class="bo">models in the documentation</a>.</p>
    <h4>Instantiate the Router</h4>
    <p>Let’s define our <code>Router</code> with the routes we want (based on the <a href="#sketch_our_app" rel="nofollow external" class="bo">diagram we made earlier</a>).</p>
    <pre><code>&#x000A;    /* /router.js &#x000A;    */&#x000A;    App.Router.map(function(){&#x000A;      this.resource('users', function(){&#x000A;        this.resource('user', { path:'/:user_id' }, function(){&#x000A;          this.route('edit');&#x000A;        });&#x000A;        this.route('create');&#x000A;      });&#x000A;    });&#x000A;    </code></pre>
    <p>This <code>Router</code> will generate exactly this:</p>
    <table>
    <tbody>
    <tr>
    <th>URL</th>
    <th>Route Name</th>
    <th>Controller</th>
    <th>Route</th>
    <th>Template</th>
    </tr>
    <tr>
    <td>N/A</td>
    <td>N/A</td>
    <td><code>ApplicationController</code></td>
    <td><code>ApplicationRoute</code></td>
    <td><code>application</code></td>
    </tr>
    <tr>
    <td><code>/</code></td>
    <td><code>index</code></td>
    <td><code>IndexController</code></td>
    <td><code>IndexRoute</code></td>
    <td><code>index</code></td>
    </tr>
    <tr>
    <td>N/A</td>
    <td><code>users</code></td>
    <td><code>UsersController</code></td>
    <td><code>UsersRoute</code></td>
    <td><code>users</code></td>
    </tr>
    <tr>
    <td><code>/users</code></td>
    <td><code>users.index</code></td>
    <td><code>UsersIndexController</code></td>
    <td><code>UsersIndexRoute</code></td>
    <td><code>users/index</code></td>
    </tr>
    <tr>
    <td>N/A</td>
    <td><code>user</code></td>
    <td><code>UserController</code></td>
    <td><code>UserRoute</code></td>
    <td><code>user</code></td>
    </tr>
    <tr>
    <td><code>/users/:user_id</code></td>
    <td><code>user.index</code></td>
    <td><code>UserIndexController</code></td>
    <td><code>UserIndexRoute</code></td>
    <td><code>user/index</code></td>
    </tr>
    <tr>
    <td><code>/users/:user_id/edit</code></td>
    <td><code>user.edit</code></td>
    <td><code>UserEditController</code></td>
    <td><code>UserEditRoute</code></td>
    <td><code>user/edit</code></td>
    </tr>
    <tr>
    <td><code>/users/create</code></td>
    <td><code>users.create</code></td>
    <td><code>UsersCreateController</code></td>
    <td><code>UsersCreateRoute</code></td>
    <td><code>users/create</code></td>
    </tr>
    </tbody>
    </table>
    <p>The <code>:user_id</code> part is called a dynamic segment because the corresponding user ID will be injected into the URL. So, it will look like <code>/users/3/edit</code>, where <code>3</code> is the user with the ID of 3.</p>
    <p>You can define either a <code>route</code> or a <code>resource</code>. Keep in mind that a <code>resource</code> is a group of routes and that it allows routes to be nested.</p>
    <p>A <code>resource</code> also resets the nested naming convention to the last resource name, which means that, instead of having <code>UsersUserEditRoute</code>, you would have <code>UserEditRoute</code>. In other words, in case this confuses you, if you have a resource nested inside another resource, then your files name would be:</p>
    <ul>
    <li>
    <code>UserEditRoute</code> instead of <code>UsersUserEditRoute</code>;</li>
    <li>
    <code>UserEditControler</code> instead of <code>UsersUserEditController</code>;</li>
    <li>
    <code>UserEditView</code> instead of <code>UsersUserEditView</code>;</li>
    <li>for templates, <code>user/edit</code> instead of <code>users/user/edit</code>.</li>
    </ul>
    <p>Learn more about <a href="http://emberjs.com/guides/routing/defining-your-routes" rel="nofollow external" class="bo">how to define routes</a> in the guides.</p>
    <h4>The Application Template</h4>
    <p>Each Ember.js app needs an <code>Application</code> template, with an <code>{{outlet}}</code> tag that holds all other templates.</p>
    <pre><code>&#x000A;    /* /templates/application.hbs &#x000A;    */&#x000A;    &lt;div class="main"&gt;&#x000A;      &lt;h1&gt;Hello World&lt;/h1&gt;&#x000A;      {{outlet}}&#x000A;    &lt;/div&gt;&#x000A;    </code></pre>
    <p>If you’ve decided to follow this tutorial without precompiling templates, here’s what your <code>index.html</code> should look like:</p>
    <pre><code>&#x000A;    /* /index.html &#x000A;    */&#x000A;      …&#x000A;      &lt;script type="text/x-handlebars" id="application"&gt;&#x000A;        &lt;div class="main"&gt;&#x000A;          &lt;h1&gt;Hello World&lt;/h1&gt;&#x000A;          {{outlet}}&#x000A;        &lt;/div&gt;&#x000A;      &lt;/script&gt;&#x000A;    &#x000A;      &lt;script src="dependencies.js"&gt;&lt;/script&gt;&#x000A;      &lt;script src="your-app.js"&gt;&lt;/script&gt;&#x000A;    &lt;/body&gt;&#x000A;    &lt;/html&gt;&#x000A;    </code></pre>
    <h4>The Users Route</h4>
    <p>This route deals with our group of users. Remember we saw <a href="#router" rel="nofollow external" class="bo">earlier</a>, in the definitions, that a route is responsible for querying the model. Well, routes have a <code>model</code> hook through which you can perform AJAX requests (for retrieving your models, if you don’t use Ember-Data) or for querying your <code>Store</code> (if you do use Ember-Data). If you’re interested in retrieving models without Ember-Data, you can <a href="#what_about_not_using_emberdata" rel="nofollow external" class="bo">jump to the section</a> in which I briefly explain how to do it.</p>
    <p>Now, let’s create our <code>UsersRoute</code>:</p>
    <pre><code>&#x000A;    /* /routes/usersRoute.js &#x000A;    */&#x000A;    App.UsersRoute = Ember.Route.extend({&#x000A;      model: function(){&#x000A;        return this.store.find('user');&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Learn more about <a href="http://emberjs.com/guides/routing/specifying-a-routes-model" rel="nofollow external" class="bo">how to specify the routes <code>model</code> hook</a> in the guides.</p>
    <p>If you visit your app at the URL <code><a href="http://localhost/#/users">http://localhost/#/users</a></code>, nothing will happen, because we need a <code>users</code> template. Here it is:</p>
    <pre><code>&#x000A;    /* /templates/users.hbs &#x000A;    */&#x000A;    &lt;ul class="users-listing"&gt;&#x000A;      {{#each user in controller}}&#x000A;        &lt;li&gt;{{user.name}}&lt;/li&gt;&#x000A;      {{else}}&#x000A;        &lt;li&gt;no users… :-(&lt;/li&gt;&#x000A;      {{/each}}&#x000A;    &lt;/ul&gt;&#x000A;    </code></pre>
    <p>The <code>each</code> loop iterates over the users collection; here, <code>controller</code> equals <code>UsersController</code>. Notice that the <code>{{#each}}</code> loop has an <code>{{else}}</code> statement; so, if the model is empty, then <code>no users… :-(</code> will be printed.</p>
    <p>Because we’ve followed Ember’s naming conventions, we can omit the declaration of the <code>UsersController</code>. Ember will guess that we are dealing with a collection because we’ve used the plural of “user.”</p>
    <h4>Object vs. Array Controller</h4>
    <p>An <code>ObjectController</code> deals with a single object, and an <code>ArrayController</code> deals with multiple objects (such as a collection). We just saw that, in our case, we don’t need to declare the <code>ArrayController</code>. But for the purpose of this tutorial, let’s declare it, so that we can set some sorting properties on it:</p>
    <pre><code>&#x000A;    /* /controllers/usersController.js &#x000A;    */&#x000A;    App.UsersController = Ember.ArrayController.extend({&#x000A;      sortProperties: ['name'],&#x000A;      sortAscending: true // false = descending&#x000A;    });&#x000A;    </code></pre>
    <p>Here, we’ve simply sorted our users alphabetically. Learn more about <a href="http://emberjs.com/guides/controllers/" rel="nofollow external" class="bo">controllers in the guides</a>.</p>
    <h4>Displaying the Number of Users</h4>
    <p>Let’s use <code>UsersController</code> to create our first <a href="http://emberjs.com/guides/object-model/computed-properties/" rel="nofollow external" class="bo">computed property</a>. This will display the number of users, so that we can see changes when adding or deleting users.</p>
    <p>In the template, we just need something as simple as this:</p>
    <pre><code>&#x000A;    /* /templates/users.hbs &#x000A;    */&#x000A;    …&#x000A;    &lt;div&gt;Users: {{usersCount}}&lt;/div&gt;&#x000A;    …&#x000A;    </code></pre>
    <p>In <code>UsersController</code>, let’s declare the <code>usersCount</code> property — but not like a regular property, because this one will be a function that returns the model’s length.</p>
    <pre><code>&#x000A;    /* /controllers/usersController.js &#x000A;    */&#x000A;    App.UsersController = Em.ArrayController.extend({&#x000A;      …&#x000A;      usersCount: function(){&#x000A;        return this.get('model.length');&#x000A;      }.property('@each')&#x000A;    });&#x000A;    </code></pre>
    <p>Basically, <code>usersCount</code> takes the <code>.property('@each')</code> method, which tells Ember.js that this function is in fact a property that is watching for any changes to one of the models in the collection (i.e. the users). Later, we will see <code>usersCount</code> incrementing and decrementing as we create and delete users.</p>
    <h4>Computed Properties</h4>
    <p>Computed properties are powerful. They let you declare functions as properties. Let’s see how they work.</p>
    <pre><code>&#x000A;    App.Person = Ember.Object.extend({&#x000A;      firstName: null,&#x000A;      lastName: null,&#x000A;    &#x000A;      fullName: function() {&#x000A;        return this.get('firstName') + ' ' + this.get('lastName');&#x000A;      }.property('firstName', 'lastName')&#x000A;    });&#x000A;    &#x000A;    var ironMan = App.Person.create({&#x000A;      firstName: "Tony",&#x000A;      lastName:  "Stark"&#x000A;    });&#x000A;    &#x000A;    ironMan.get('fullName') // "Tony Stark"&#x000A;    </code></pre>
    <p>In this example, the <code>Person</code> object has two static properties, which are <code>firstName</code> and <code>lastName</code>. It also has a <code>fullName</code> computed property, which concatenates a full name by retrieving the value of the two static properties. Note that the <code>.property('firstName', 'lastName')</code> method tells the function to re-execute if either <code>firsName</code> or <code>lastName</code> changes.</p>
    <p>Properties (whether static or computed) are retrieved with <code>.get('property')</code> and can be set with <code>.set('property', newValue)</code>.</p>
    <p>If you find yourself setting multiple properties consecutively, a better way to do it is with one single <code>.setProperties({})</code>, rather than with multiple instances of <code>.set()</code>. So, instead of doing this…</p>
    <pre><code>&#x000A;    this.set('propertyA', 'valueA');&#x000A;    this.set('propertyB', valueB);&#x000A;    this.set('propertyC', 0);&#x000A;    this.set('propertyD', false);&#x000A;    </code></pre>
    <p>… you would do this:</p>
    <pre><code>&#x000A;    this.setProperties({&#x000A;      'propertyA': 'valueA',&#x000A;      'propertyB': valueB,&#x000A;      'propertyC': 0,&#x000A;      'propertyD': false&#x000A;    });&#x000A;    </code></pre>
    <p>The documentation has so much more information about how to bind data with <a href="http://emberjs.com/guides/object-model/computed-properties/" rel="nofollow external" class="bo">computed properties</a>, <a href="http://emberjs.com/guides/object-model/observers" rel="nofollow external" class="bo">observers</a> and <a href="http://emberjs.com/guides/object-model/bindings" rel="nofollow external" class="bo">bindings</a>.</p>
    <h4>Redirecting From the Index Page</h4>
    <p>If you go to the home page of your app (<code><a href="http://localhost/">http://localhost/</a></code>), you might be asking yourself why nothing is happening. That’s because you are viewing the index page, and we don’t have an <code>index</code> template. Let’s add one, then. We’ll call it <code>index.hbs</code>.</p>
    <p>Ember.js will notice that you are creating the <code>index</code> template for <code>IndexRoute</code>; so, no need to tell it anything else about the index in the <code>Router</code>. This is called an initial route. Three of them are available: <code>ApplicationRoute</code>, <code>IndexRoute</code> and <code>LoadingRoute</code>. Learn more about them <a href="http://emberjs.com/guides/routing/defining-your-routes/#toc_initial-routes" rel="nofollow external" class="bo">in the guides</a>.</p>
    <p>Now, let’s add a link to the user’s page with the <code>{{#link-to}}…{{/link-to}}</code> block helper. Why a block helper? Because you’re able to write text between the opening and closing tags, as if it were a real custom HTML element.</p>
    <pre><code>&#x000A;    /* /templates/index.hbs &#x000A;    */&#x000A;    {{#link-to "users"}} Go to the users page {{/link-to}}&#x000A;    </code></pre>
    <p>This takes the route’s name that you want to link to as the first argument (the second optional argument is a model). Under the hood, it’s just a regular <code>&lt;a&gt;</code> element, although Ember also handles for us the <code>active</code> class name when reaching the matching route. Those <code>link-to</code>’s are perfect for navigation menus. Learn more about them <a href="http://emberjs.com/guides/templates/links" rel="nofollow external" class="bo">in the guides</a>.</p>
    <p>Another approach would be to tell <code>IndexRoute</code> to redirect to <code>UsersRoute</code>. Again, pretty easy:</p>
    <pre><code>&#x000A;    /* /routes/indexRoute.js &#x000A;    */&#x000A;    App.IndexRoute = Ember.Route.extend({&#x000A;      redirect: function(){&#x000A;        this.transitionTo('users');&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Now, when you visit the home page, your will immediately be redirected to the <code>/#/users</code> URL.</p>
    <h4>Single User Route</h4>
    <p>Before getting our hands dirty with building the dynamic segment, we need a way to link to each user from the <code>users</code> template. Let’s use the <code>{{#link-to}}</code> block helper inside the user’s <code>each</code> loop.</p>
    <pre><code>&#x000A;    /* /templates/users.hbs &#x000A;    */&#x000A;    …&#x000A;    {{#each user in controller}}&#x000A;      &lt;li&gt;&#x000A;        {{#link-to "user" user}}&#x000A;          {{user.name}}&#x000A;        {{/link-to}}&#x000A;      &lt;/li&gt;&#x000A;    {{/each}}&#x000A;    </code></pre>
    <p>The second argument of <code>link-to</code> is the model that will be passed to <code>UserRoute</code>.</p>
    <p>OK, let’s get back to our single user template. It looks like this:</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    &lt;div class="user-profile"&gt;&#x000A;      &lt;img {{bind-attr src="avatarUrl"}} alt="User's avatar" /&gt;&#x000A;      &lt;h2&gt;{{name}}&lt;/h2&gt;&#x000A;      &lt;span&gt;{{email}}&lt;/span&gt;&#x000A;      &lt;p&gt;{{bio}}&lt;/p&gt;&#x000A;      &lt;span&gt;Created {{creationDate}}&lt;/span&gt;&#x000A;    &lt;/div&gt;&#x000A;    </code></pre>
    <p>Note that you can’t use <code>&lt;img src="{{avatarUrl}}"&gt;</code>, because data inside attributes are bound with the <code>bind-attr</code> helper. For instance, you could do something like <code>&lt;img {{bind-attr height="imgHeight}}"/&gt;</code>, where <code>imgHeight</code> is a computed property in the current controller.</p>
    <p>You’ll find all you need to know about binding <a href="http://emberjs.com/guides/templates/binding-element-attributes/" rel="nofollow external" class="bo">attributes</a> and <a href="http://emberjs.com/guides/templates/binding-element-class-names/" rel="nofollow external" class="bo">class names</a> in the guides.</p>
    <p>So far, so good. But nothing happens when you click on the user’s links, because we told the <code>Router</code> that we want <code>UserRoute</code> to be nested in <code>UsersRoute</code>. So, we need an <code>{{outlet}}</code> in which to render the user template.</p>
    <pre><code>&#x000A;    /* /templates/users.hbs &#x000A;    */&#x000A;    …&#x000A;    {{#each user in controller}}&#x000A;    …&#x000A;    {{/each}}&#x000A;    &#x000A;    {{outlet}}&#x000A;    </code></pre>
    <p>An <code>{{outlet}}</code> is like a dynamic placeholder into which other templates can be injected when <code>{{#link-to}}</code> tags are clicked. It allows for views to be nested.</p>
    <p>Now, you should be able to view the user template injected in the page when visiting the page at the URL <code>/#/users/1</code>.</p>
    <p>Hey, wait a minute! We have declared neither <code>UserRoute</code> nor <code>UserController</code>, but it’s still working! Why is that? Well, <code>UserRoute</code> is the singular of <code>UsersRoute</code>, so Ember has generated the route and the controller for us (in memory). Thank goodness for naming conventions!</p>
    <p>For the sake of consistency, let’s declare them anyway, so that we can see how they look:</p>
    <pre><code>&#x000A;    /* /routes/userRoute.js &#x000A;    */&#x000A;    App.UserRoute = Ember.Route.extend({&#x000A;      model: function(params) { &#x000A;        return this.store.find('user', params.user_id);&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <pre><code>&#x000A;    /* /controllers/userController.js &#x000A;    */&#x000A;    App.UserController = Ember.ObjectController.extend();&#x000A;    </code></pre>
    <p>Learn more about <a href="http://emberjs.com/guides/routing/specifying-a-routes-model/#toc_dynamic-models" rel="nofollow external" class="bo">dynamic segments</a> in the guides.</p>
    <h4>Edit a User</h4>
    <p>Moving on to the edit user form nested in the single user, the template looks like this:</p>
    <pre><code>&#x000A;    /* /templates/user/edit.hbs &#x000A;    */&#x000A;    &lt;div class="user-edit"&gt;&#x000A;      &lt;label&gt;Choose user avatar&lt;/label&gt;&#x000A;      {{input value=avatarUrl}}&#x000A;    &#x000A;      &lt;label&gt;User name&lt;/label&gt;&#x000A;      {{input value=name}}&#x000A;    &#x000A;      &lt;label&gt;User email&lt;/label&gt;&#x000A;      {{input value=email}}&#x000A;    &#x000A;      &lt;label&gt;User short bio&lt;/label&gt;&#x000A;      {{textarea value=bio}}&#x000A;    &lt;/div&gt;&#x000A;    </code></pre>
    <p>Let’s talk about those <code><a href="http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_input" rel="nofollow external" class="bo">{{input}}</a></code> and <code><a href="http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_textarea" rel="nofollow external" class="bo">{{textarea}}</a></code> tags. This form’s goal is to enable us to edit the user’s data, and these custom <code>input</code> tags take the model’s properties as parameters to enable data-binding.</p>
    <p>Note that it’s <code>value=model</code>, without the <code>" "</code>. The <code>{{input}}</code> helper is a shorthand for <code>{{Ember.TextField}}</code>. Ember.js has those <a href="http://emberjs.com/guides/views/built-in-views" rel="nofollow external" class="bo">built-in views</a> especially for form elements.</p>
    <p>If you visit your app at the URL <code>/#/users/1/edit</code>, nothing will happen, because, again, we need an <code>{{outlet}}</code> to nest the edit template into the single user template.</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    …&#x000A;    {{outlet}}&#x000A;    </code></pre>
    <p>Now, the template is correctly injected in the page. But the fields are still empty, because we need to tell the route which model to use.</p>
    <pre><code>&#x000A;    /* /routes/userEditRoute.js &#x000A;    */&#x000A;    App.UserEditRoute = Ember.Route.extend({&#x000A;      model: function(){ &#x000A;        return this.modelFor('user');&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>The <code><a href="http://emberjs.com/api/classes/Ember.Route.html#method_modelFor" rel="nofollow external" class="bo">modelFor</a></code> method lets you use the model of another route. Here, we’ve told <code>UserEditRoute</code> to get the model of <code>UserRoute</code>. The fields are now correctly populated with the model data. Try to edit them — you will see the changes occur in the parent templates as well!</p>
    <h4>Our First Action</h4>
    <p>OK, now we need a button to click that redirects us from <code>UserRoute</code> to <code>UserEditRoute</code>.</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    &lt;div class="user-profile"&gt;&#x000A;      &lt;button {{action "edit"}}&gt;Edit&lt;/button&gt;&#x000A;      …&#x000A;    </code></pre>
    <p>We just added a simple <code>button</code> that triggers our first <code>{{action}}</code>. Actions are events that trigger associated methods in their current controller. If no method is found in the controller, then the action bubbles up through routes until it matches something. This is explained well <a href="http://emberjs.com/guides/templates/actions/#toc_action-bubbling" rel="nofollow external" class="bo">in the guides</a>.</p>
    <p>In other words, if we <code>click</code> on the <code>button</code>, then it will trigger the <code>edit</code> action found in the controller. So, let’s add it to <code>UserController</code>:</p>
    <pre><code>&#x000A;    /* /controllers/userController.js &#x000A;    */&#x000A;    App.UserController = Ember.ObjectController.extend({&#x000A;      actions: {&#x000A;        edit: function(){&#x000A;          this.transitionToRoute('user.edit');&#x000A;        }&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Actions, whether in controllers or in routes, are stored in an <code>actions</code> hash. But this is not the case for default actions, such as <code>click</code>, <code>doubleClick</code>, <code>mouseLeave</code> and <code>dragStart</code>. The Ember.js website has a <a href="http://emberjs.com/api/classes/Ember.View.html#toc_event-names" rel="nofollow external" class="bo">complete list</a>.</p>
    <p>Here, basically, our <code>edit</code> action says, “Go to the <code>user.edit</code> route.” That’s pretty much it.</p>
    <h4>TransitionTo or TransitionToRoute?</h4>
    <p>On a side note, transitioning from routes is slightly different from transitioning from controllers:</p>
    <pre><code>&#x000A;    // from a route&#x000A;    this.transitionTo('your.route')&#x000A;    // from a controller&#x000A;    this.transitionToRoute('your.route')&#x000A;    </code></pre>
    <h4>Saving User Modifications</h4>
    <p>Let’s see how to save modifications after a user’s data has been edited. By saving, we mean persisting the changes. With Ember-Data, this means telling <code>Store</code> to <code>save()</code> the new <code>record</code> of the modified user. The <code>Store</code> will then tell the <code>adapter</code> to perform an AJAX PUT request (if our adapter is the <code>RESTAdapter</code>).</p>
    <p>From our application’s point of view, this would be an “OK” <code>button</code> that saves modifications and then transitions to the parent route. Again, we’ll use an <code>{{action}}</code>.</p>
    <pre><code>&#x000A;    /* /templates/user/edit.hbs &#x000A;    */&#x000A;    &lt;button {{action "save"}}&gt; ok &lt;/button&gt;&#x000A;    </code></pre>
    <pre><code>&#x000A;    /* /controllers/userEditController.js &#x000A;    */&#x000A;    App.UserEditController = Ember.ObjectController.extend({&#x000A;      actions: {&#x000A;        save: function(){&#x000A;          var user = this.get('model');&#x000A;          // this will tell Ember-Data to save/persist the new record&#x000A;          user.save();&#x000A;          // then transition to the current user&#x000A;          this.transitionToRoute('user', user);&#x000A;        }&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Our edit mode is working well. Now, let’s see how to delete a user.</p>
    <h4>Delete a User</h4>
    <p>We can add a delete <code>button</code> beside the edit button in the <code>user</code> template — again, with a <code>delete</code> <code>{{action}}</code>, this time defined in <code>UserController</code>.</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    &lt;button {{action "delete"}}&gt;Delete&lt;/button&gt;&#x000A;    </code></pre>
    <pre><code>&#x000A;    /* /controllers/userController.js &#x000A;    */&#x000A;    …&#x000A;    actions: {&#x000A;      delete: function(){&#x000A;        // this tells Ember-Data to delete the current user&#x000A;        this.get('model').deleteRecord();&#x000A;        this.get('model').save();&#x000A;        // then transition to the users route&#x000A;        this.transitionToRoute('users');&#x000A;      }&#x000A;    }&#x000A;    </code></pre>
    <p>Now, when you click on the “Delete” button, the <code>user</code> is instantly trashed. A bit rough. We should add a confirm state, something like “Are you sure?” with “Yes” and “No” buttons. To do this, we need to change <code>{{action "delete"}}</code> to make it show <code>confirm-box</code> instead of immediately deleting the user. Then, we obviously need to put <code>confirm-box</code> in the user template.</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    {{#if deleteMode}}&#x000A;    &lt;div class="confirm-box"&gt;&#x000A;      &lt;h4&gt;Really?&lt;/h4&gt;&#x000A;      &lt;button {{action "confirmDelete"}}&gt; yes &lt;/button&gt;&#x000A;      &lt;button {{action "cancelDelete"}}&gt; no &lt;/button&gt;&#x000A;    &lt;/div&gt;&#x000A;    {{/if}}&#x000A;    </code></pre>
    <p>We’ve just written our first Handlebars <code>{{if}}</code> statement. It prints <code>div.confirm-box</code> only if the <code>deleteMode</code> property is <code>true</code>. We need to define this <code>deleteMode</code> in the current controller and then change the <code>delete</code> action to make it toggle <code>deleteMode</code>’s value to <code>true</code> or <code>false</code>. Now, our <code>UserController</code> looks like this:</p>
    <pre><code>&#x000A;    /* /controllers/userController.js &#x000A;    */&#x000A;    App.UserController = Ember.ObjectController.extend({&#x000A;      // the deleteMode property is false by default&#x000A;      deleteMode: false,&#x000A;    &#x000A;      actions: {&#x000A;        delete: function(){&#x000A;          // our delete method now only toggles deleteMode's value&#x000A;          this.toggleProperty('deleteMode');&#x000A;        },&#x000A;        cancelDelete: function(){&#x000A;          // set deleteMode back to false&#x000A;          this.set('deleteMode', false);&#x000A;        },&#x000A;        confirmDelete: function(){&#x000A;          // this tells Ember-Data to delete the current user&#x000A;          this.get('model').deleteRecord();&#x000A;          this.get('model').save();&#x000A;          // and then go to the users route&#x000A;          this.transitionToRoute('users');&#x000A;          // set deleteMode back to false&#x000A;          this.set('deleteMode', false);&#x000A;        },&#x000A;        // the edit method remains the same&#x000A;        edit: function(){ &#x000A;          this.transitionToRoute('user.edit');&#x000A;        }&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Deletion now works perfectly with the “Yes” and “No” buttons. Awesome! Finally, the last thing to build is the create route.</p>
    <h4>Create a User</h4>
    <p>To create a user, let’s do something fun: Let’s reuse the edit template, because the create form will be exactly the same as the edit user form. First, we declare the create route, which will return an empty object in its <code>model</code> hook:</p>
    <pre><code>&#x000A;    /* /routes/usersCreateRoute.js &#x000A;    */&#x000A;    App.UsersCreateRoute = Ember.Route.extend({&#x000A;      model: function(){&#x000A;        // the model for this route is a new empty Ember.Object&#x000A;        return Em.Object.create({});&#x000A;      },&#x000A;    &#x000A;      // in this case (the create route), we can reuse the user/edit template&#x000A;      // associated with the usersCreateController&#x000A;      renderTemplate: function(){&#x000A;        this.render('user.edit', {&#x000A;          controller: 'usersCreate'&#x000A;        });&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Note the <code>renderTemplate</code> method; it enables us to associate a particular template with a route. Here, we’re telling <code>UsersCreateRoute</code> to use the user and edit template with <code>UsersCreateController</code>. Learn more about renderTemplate <a href="http://emberjs.com/guides/routing/rendering-a-template/" rel="nofollow external" class="bo">in the guides</a>.</p>
    <p>Now, let’s define another <code>save</code> action, but this time in <code>UsersCreateController</code>. (Remember that an <code>action</code> first tries to match a corresponding method in the <em>current</em> controller.)</p>
    <pre><code>&#x000A;    /* /controllers/usersCreateController.js &#x000A;    */&#x000A;    App.UsersCreateController = Ember.ObjectController.extend({&#x000A;      actions: {&#x000A;        save: function(){&#x000A;          // just before saving, we set the creationDate&#x000A;          this.get('model').set('creationDate', new Date());&#x000A;    &#x000A;          // create a record and save it to the store&#x000A;          var newUser = this.store.createRecord('user', this.get('model'));&#x000A;          newUser.save();&#x000A;    &#x000A;          // redirects to the user itself&#x000A;          this.transitionToRoute('user', newUser);&#x000A;        }&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>Finally, let’s add the <code>{{#link-to}}</code> helper in the users templates, so that we can access the creation form:</p>
    <pre><code>&#x000A;    /* /templates/users.hbs &#x000A;    */&#x000A;    {{#link-to "users.create" class="create-btn"}} Add user {{/link-to}}&#x000A;    …&#x000A;    </code></pre>
    <p>That’s all there is to creating users!</p>
    <h4>Format Data With Helpers</h4>
    <p>We’ve <a href="#helpers" rel="nofollow external" class="bo">already defined</a> what <code>helpers</code> are. Now, let’s see how to create one that will format an ugly date into a nice clean formatted one. The <a href="http://momentjs.com" rel="nofollow external" class="bo">Moment.js</a> library is awesome for this purpose.</p>
    <p>Grab <a href="http://momentjs.com" rel="nofollow external" class="bo">Moment.js</a> and load it in the page. Then, we’ll define our first helper:</p>
    <pre><code>&#x000A;    /* /helpers/helpers.js &#x000A;    */&#x000A;    Ember.Handlebars.helper('formatDate', function(date){&#x000A;      return moment(date).fromNow();&#x000A;    });&#x000A;    </code></pre>
    <p>Modify the user template so that it uses the <code>formatDate</code> helper on the <code>{{creationDate}}</code> property:</p>
    <pre><code>&#x000A;    /* /templates/user.hbs &#x000A;    */&#x000A;    …&#x000A;    &lt;span&gt;Created {{formatDate creationDate}}&lt;/span&gt;&#x000A;    …&#x000A;    </code></pre>
    <p>That’s it! You should see the dates nicely formatted: “2 days ago,” “One month ago,” etc.</p>
    <h4>Format Data With Bound Helpers</h4>
    <p>In this case, our date is static data because it’s not going to change in the future. But if you have data that needs to be updated (for example, a formatted price), then you would have to use a <code>BoundHelper</code> instead of the regular helper.</p>
    <pre><code>&#x000A;    /* /helpers/helpers.js &#x000A;    */&#x000A;    Ember.Handlebars.registerBoundHelper('formatDate', function(date){&#x000A;      return moment(date).fromNow();&#x000A;    });&#x000A;    </code></pre>
    <p>A bound helper is able to automatically update itself if the data changes. Learn more about bound helpers <a href="http://emberjs.com/api/classes/Ember.Handlebars.html#method_registerBoundHelper" rel="nofollow external" class="bo">in the guides</a>.</p>
    <h4>Switch to the LocalStorage Adapter</h4>
    <p>Our app looks to be working fine, so we are ready to switch to the real thing. We could enable the <code>RESTAdapter</code>, but then we would need a REST server on which we could perform GET, PUT, POST and DELETE requests. Instead, let’s use <code>LSAdapter</code>, a third-party adapter that you can <a href="https://github.com/rpflorence/ember-localstorage-adapter/blob/master/localstorage_adapter.js" rel="nofollow external" class="bo">download on GitHub</a>. Load it in your page (just after Ember-Data), comment out all of the <code>FIXTURE</code> data, and change <code>ApplicationAdapter</code> to <code>DS.LSAdapter</code>:</p>
    <pre><code>&#x000A;    /* /store.js &#x000A;    */&#x000A;    App.ApplicationAdapter = DS.LSAdapter;&#x000A;    </code></pre>
    <p>Now, your users’ data will persist in local storage. That’s all! Seriously, it’s that easy. Just to be sure, open the Developer Tools in your browser and go into the “Resource” panel. In the “Local Storage” tab, you should find an entry for <code>LSAdapter</code> with all of your users’ data.</p>
    <p><img alt="console-localstorage" src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/console-localstorage.png" width="500" height="271" style="max-width: 100%; height: auto;"></p>
    <h3>Playing With Views</h3>
    <p>So far, we haven’t declared any views in our simple CRUD, only templates. Why would we care about views? Well, they are powerful for events handling, animations and reusable components.</p>
    <h4>jQuery and the didInsertElement</h4>
    <p>How can we use jQuery the way we are used to for Ember.js’ views? Each view and component has a <code>didInsertElement</code> hook, which assures us that the view has indeed been inserted into the DOM. With that, you have secure jQuery access to elements in the page.</p>
    <pre><code>&#x000A;    App.MyAwesomeComponent = Em.Component.extend({&#x000A;      didInsertElement: function(){&#x000A;        // this = the view&#x000A;        // this.$() = $(the view)&#x000A;        this.$().on('click', '.child .elem', function(){&#x000A;          // do stuff with jQuery&#x000A;        });&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>If you’ve registered jQuery-like events from inside <code>didInsertElement</code>, then you can use <code>willDestroyElement</code> to clean them up after the view has been removed from the DOM, like so:</p>
    <pre><code>&#x000A;    App.MyAwesomeComponent = Em.Component.extend({&#x000A;      didInsertElement: function(){&#x000A;        this.$().on('click', '.child .elem', function(){&#x000A;          // do stuff with jQuery&#x000A;        });&#x000A;      },&#x000A;      willDestroyElement: function(){&#x000A;        this.$().off('click');&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <h4>Side Panel Components With className Bindings</h4>
    <p>The combination of computed property and <code>className</code> binding sounds like a scary technique, but it’s really not that bad. The idea is that we add or remove a CSS class on an element if a property is either <code>true</code> or <code>false</code>. Of course, the CSS class contains a CSS transition.</p>
    <p>Suppose we have a hidden div in the DOM. When this div has a class of <code>opened</code>, it slides in. When it has a class of <code>closed</code>, it slides out. A side panel is a perfect example for this, so let’s build one.</p>
    <p>Here’s a JS Bin so that you can test the code:</p>
    <p><a href="http://emberjs.jsbin.com/utimiZI/12/embed?js,output" rel="nofollow external" class="bo">Reusable Ember.js side panels</a></p>
    <p>Let’s go through each tab in turn:</p>
    <ul>
    <li>
    <strong>JavaScript tab</strong><br>
    First, we declare our <code>SidePanelComponent</code> with default <code>classNames</code>. Then, <code>classNameBindings</code> is used to test whether <code>isOpen</code> is <code>true</code> or <code>false</code>, so that it returns <code>closed</code> or <code>opened</code>. Finally, <code>component</code> has a <code>toggleSidepanel</code> action that simply toggles the <code>isOpen</code> boolean.</li>
    <li>
    <strong>HTML tab</strong><br>
    This is the side panel’s markup. Note the <code>{{#side-panel}}…{{/side-panel}}</code> block tags; we can put whatever we want between them, which makes our side panel incredibly reusable. The <code>btn-toggle</code> button calls the <code>toggleSidepanel</code> action located in the component. The <code>{{#if isOpen}}</code> adds some logic by checking the value of the <code>isOpen</code> property.</li>
    <li>
    <strong>CSS tab</strong><br>
    Here, we are basically putting the side panel off screen. The <code>opened</code> class slides it in, and <code>closed</code> slides it out. The animation is possible because we are listening for <code>translate2D</code> changes (<code>transition:transform .3s ease</code>).</li>
    </ul>
    <p>The guides have a lot more examples on how to bind class names <a href="http://emberjs.com/guides/components/customizing-a-components-element" rel="nofollow external" class="bo">from components</a> and <a href="http://emberjs.com/guides/templates/binding-element-class-names" rel="nofollow external" class="bo">from inside templates</a>.</p>
    <h4>Modals With Layout and Event Bubbling</h4>
    <p>This technique is way more complicated than the previous one, because a lot of Ember.js features are involved. The idea is to make an event bubble from a view to a route so that we can toggle a property located in a controller somewhere in the app. Also, here we are using a <code>View</code> instead of a <code>Component</code> (remember that, under the hood, a component is an isolated view).</p>
    <p><a href="http://emberjs.jsbin.com/aKUWUF/8/embed?js,output" rel="nofollow external" class="bo">Reusable Ember.js modals</a></p>
    <ul>
    <li>
    <strong>JavaScript tab</strong><br>
    The <code>modalView</code> is the default <code>layout</code> for all of our modals. It has two methods, <code>showModal</code> and <code>hideModal</code>. The <code>showModal</code> method is called with an <code>action</code> that bubbles up, first through controller, then through routes, until it finds a corresponding <code>showModal</code> action. We’ve stored <code>showModal</code> in the highest route possible, the <code>applicationRoute</code>. Its only goal is to set the <code>modalVisible</code> property inside the controller that was passed in the <code>action</code>’s second argument. And yes, creating a property at the same time as we set it is possible.</li>
    <li>
    <strong>HTML tab</strong><br>
    Each modal has its own template, and we’ve used the convenient <code>{{#view App.ModalView}}…{{/view}}</code> block tags to encapsulate them in <code>modal_layout</code>. The modal’s controllers are not even declared because Ember.js has them in memory. Note that the <code>{{render}}</code> helper takes parameters, which are the template’s name and a generated controller for this template. So, here we are calling a <code>modal01</code> template and a <code>modal01</code> controller (auto-generated).</li>
    <li>
    <strong>CSS tab</strong><br>
    For the purpose of this example, modals need to be present in the DOM. This can feel like a constraint, but the main benefit is the reduced paint cost; otherwise, Ember has to inject and remove them every time we call them. The second benefit is CSS transitions. The <code>shown</code> class applies two transitions: first, the top position (because the modal is off screen by default), then, with a little delay, it transitions the opacity (which also has a <a href="https://speakerdeck.com/ariya/fluid-user-interface-with-hardware-acceleration?slide=36" rel="nofollow external" class="bo">reduced</a> paint <a href="http://css-tricks.com/w3conf-ariya-hidayat-fluid-user-interface-with-hardware-acceleration" rel="nofollow external" class="bo">cost</a> when transitioning). The <code>hidden</code> class does the same in reverse. Obviously, you can apply a <a href="http://tympanus.net/Development/ModalWindowEffects" rel="nofollow external" class="bo">lot of cool transitions</a> to your modals if they stay in the DOM.</li>
    </ul>
    <p>The guides have a lot more information about <a href="http://emberjs.com/guides/views/handling-events" rel="nofollow external" class="bo">events</a>, <a href="http://emberjs.com/guides/understanding-ember/the-view-layer/#toc_event-bubbling" rel="nofollow external" class="bo">event bubbling</a>, <a href="http://emberjs.com/guides/views/adding-layouts-to-views" rel="nofollow external" class="bo">layouts</a> and the <a href="http://emberjs.com/guides/templates/rendering-with-helpers/#toc_the-code-render-code-helper" rel="nofollow external" class="bo">{{render}}</a> helper tag.</p>
    <h3>What Is Ember-Data?</h3>
    <p>Ember-Data is in beta as of the time of writing, so please use it with caution.</p>
    <p>It is a library that lets you retrieve records from a server, hold them in a store, update them in the browser and, finally, save them back to the server. The store may be configured with various adapters, depending on your back end. Here’s a diagram of Ember-Data’s architecture.</p>
    <p><img alt="ember-data-sketch" src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/ember-data-sketch.png" width="500" height="600" style="max-width: 100%; height: auto;"></p>
    <h4>The Store</h4>
    <p>The store holds data loaded from the server (i.e. records). Routes and controllers can query the store for records. If a given record is called for the first time, then the store tells the adapter to load it over the network. Then, the store caches it for the next time you ask for it.</p>
    <h4>Adapters</h4>
    <p>The application queries the store, and the adapter queries the back end. Each adapter is made for a particular back end. For example, the <code>RESTAdapter</code> deals with JSON APIs, and <code>LSAdapter</code> deals with local storage.</p>
    <p>The idea behind Ember-Data is that, if you have to change the back end, then you simply plug another adapter, without having to touch a single line of your application’s code.</p>
    <ul>
    <li>
    <code>FixtureAdapter</code><br>
    <code>FixtureAdapter</code> is perfect for testing Ember and Ember-Data. Fixtures are just sample data that you can work with until your app reaches the production phase. We went over how to configure it in an <a href="#set_up_the_model_with_ember_data_fixtureadapter" rel="nofollow external" class="bo">earlier part of this article</a>.</li>
    <li>
    <code>RESTAdapter</code><br>
    <code>RESTAdapter</code> is the default adapter in Ember-Data. It lets you perform GET, PUT, POST and DELETE requests over a REST API. It also requires some <a href="http://emberjs.com/guides/models/the-rest-adapter/#toc_json-conventions" rel="nofollow external" class="bo">specific JSON conventions</a> in return. Enabling <code>RESTAdapter</code> looks like this:
    <pre><code>&#x000A;    App.ApplicationAdapter = DS.RESTAdapter.extend({&#x000A;      host: '<a href="https://your.api.com">https://your.api.com</a>'&#x000A;    });&#x000A;    </code></pre>
    <p>There’s a lot more to discover about <code>RESTAdapter</code> <a href="http://emberjs.com/guides/models/the-rest-adapter" rel="nofollow external" class="bo">in the guides</a>.</p>
    </li>
    <li>
    <strong>Custom adapter</strong><br>
    You could use something other than the two default adapters (<code>FixtureAdapter</code> and <code>RESTAdapter</code>). A <a href="https://github.com/search?q=ember+adapter&amp;ref=reposearch" rel="nofollow external" class="bo">bunch of them are on GitHub</a>. For instance, there’s the <a href="https://github.com/rpflorence/ember-localstorage-adapter" rel="nofollow external" class="bo">LocalStorage Adapter</a>, which is demonstrated in the guides’ sample <a href="http://emberjs.com/guides/getting-started/using-other-adapters" rel="nofollow external" class="bo">Todos</a> app and is also the one I use in the <a href="http://jkneb.github.io/ember-crud" rel="nofollow external" class="bo">demo</a>.</li>
    </ul>
    <h4>What About Not Using Ember-Data?</h4>
    <p>In this article, I’ve chosen to cover Ember-Data because it’s almost stable and is probably one of the coolest thing happening these days in the JavaScript world. But perhaps you’re wondering whether getting rid of it is possible. The answer is yes! In fact, using Ember.js without Ember-Data is pretty easy.</p>
    <p>There are two ways to do it.</p>
    <p>You could use another library for your model’s retrieval and persistence. <a href="https://github.com/ebryn/ember-model" rel="nofollow external" class="bo">Ember-Model</a>, <a href="https://github.com/zendesk/ember-resource" rel="nofollow external" class="bo">Ember-Resource</a>, <a href="https://github.com/endlessinc/ember-restless" rel="nofollow external" class="bo">Ember-Restless</a> and the recent <a href="http://epf.io/" rel="nofollow external" class="bo">EPF</a> are good alternatives. EmberWatch has written a great little article that sums up “<a href="http://blog.emberwatch.com/2013/06/19/alternatives-ember-data.html" rel="nofollow external" class="bo">Alternatives to Ember Data</a>.”</p>
    <p>The other way would be to not rely on a library, in which case you would have to implement methods to retrieve models with AJAX calls. “<a href="http://eviltrout.com/2013/03/23/ember-without-data.html" rel="nofollow external" class="bo">Ember Without Ember Data</a>,” by Robin Ward (the guy behind <a href="http://www.discourse.org/" rel="nofollow external" class="bo">Discourse</a>), is a great read. “<a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js-part-3" rel="nofollow external" class="bo">Getting Into Ember.js, Part 3</a>” by Rey Bango on Nettuts+ deals specifically with models.</p>
    <p>For instance, here’s a static method with <code>reopenClass</code> on a model:</p>
    <pre><code>&#x000A;    /* /models/user.js&#x000A;    */&#x000A;    // our own findStuff method inside the User model&#x000A;    App.User.reopenClass({&#x000A;      findStuff: function(){&#x000A;        // use regular AJAX / Promises calls&#x000A;        return $.getJSON("<a href="http://your.api.com/api%22).then(function(response)">http://your.api.com/api").then(function(response)</a> {&#x000A;          var users = [];&#x000A;          // creates new Ember objects and store them into the users Array&#x000A;          response.users.forEach(function(user){&#x000A;            users.push( App.User.create(user) );&#x000A;          });&#x000A;          // finally returns the array full of Ember Objects&#x000A;          return users;&#x000A;        });&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <p>You would use your <code>findStuff</code> method in your routes’ <code>model</code> hook:</p>
    <pre><code>&#x000A;    /* /routes/usersRoute.js&#x000A;    */&#x000A;    App.UsersRoute = Em.Route.extend({&#x000A;      model: function(){&#x000A;        return App.User.findStuff();&#x000A;      }&#x000A;    });&#x000A;    </code></pre>
    <h3>What Is Handlebars Template Precompiling?</h3>
    <p>Basically, template precompiling entails grabbing all Handlebars templates, transposing them into JavaScript strings, and then storing them in <code>Ember.TEMPLATES</code>. It also entails an additional JavaScript file to load in your page, which will contain the JavaScript-compiled versions of all of your Handlebars templates.</p>
    <p>For very simple apps, precompiling can be avoided. But if you have too many <code>&lt;script type="text/x-handlebars"&gt;</code> templates in your main HTML file, then precompiling will help to organize your code.</p>
    <p>Furthermore, precompiling your templates will enable you to use the runtime version of Handlebars, which is lighter than the regular one. You can find both the runtime and standard versions on the <a href="http://handlebarsjs.com/" rel="nofollow external" class="bo">Handlebars website</a>.</p>
    <h4>Template Naming Conventions</h4>
    <p><code><a href="http://emberjs.com/guides/templates/rendering-with-helpers/" rel="nofollow external" class="bo">Partials</a></code> have to begin with a <code>_</code>. So, you will have to declare a <code>_yourpartial.hbs</code> file or, if you don’t precompile your templates, a <code>&lt;script type="text/x-handlebars" id="_yourpartial"&gt;</code> tag.</p>
    <p><code><a href="http://emberjs.com/guides/components" rel="nofollow external" class="bo">Components</a></code> have to begin with <code>components/</code>. So, you will have to store them in a <code>components/</code> folder or, if you don’t precompile templates, declare a <code>&lt;script type="text/x-handlebars" id="components/your-component"&gt;</code> tag. Component names are hyphenated.</p>
    <p>Otherwise, views have a <code>templateName</code> property in which you can specify which template to associate with the view. Take this declaration of a template:</p>
    <pre><code>&#x000A;    &lt;script type="text/x-handlebars" id="folder/some-template"&gt;&#x000A;      Some template&#x000A;    &lt;/script&gt;&#x000A;    </code></pre>
    <p>You can associate it with a particular view:</p>
    <pre><code>&#x000A;    App.SomeView = Em.View.extend({&#x000A;      templateName: 'folder/some-template'&#x000A;    });&#x000A;    </code></pre>
    <h4>Precompiling With Grunt</h4>
    <p>If you use <a href="http://gruntjs.com" rel="nofollow external" class="bo">Grunt</a>, then you probably use it for other building-related tasks (concatenation, compression, that kind of stuff), in which case you should be familiar with the <code>package.json</code> file, which comes with Node.js and Node Packaged Modules. I’ll assume you are already familiar with Grunt.</p>
    <p>As of the time of writing, two plugins are available for Grunt to transpose your <code>.hbs</code> files to a <code>templates.js</code> file: <code><a href="https://github.com/yaymukund/grunt-ember-handlebars" rel="nofollow external" class="bo">grunt-ember-handlebars</a></code> and <code><a href="https://github.com/dgeb/grunt-ember-templates" rel="nofollow external" class="bo">grunt-ember-templates</a></code>. The latter seems a bit more up to date than the former.</p>
    <p>I’ve made a Gist for each of them, in case you need help with configuration:</p>
    <ul>
    <li>
    <code>grunt-ember-handlebars</code> (<a href="https://gist.github.com/jkneb/6072299" rel="nofollow external" class="bo">see the Gist</a>),</li>
    <li>
    <code>grunt-ember-templates</code> (<a href="https://gist.github.com/jkneb/6599001" rel="nofollow external" class="bo">see the Gist</a>).</li>
    </ul>
    <p>Once it’s configured, you should be able to run <code>grunt</code> in a command-line editor, which should produce the <code>templates.js</code> file. Load it into <code>index.html</code> (after <code>ember.js</code>), and then go into the browser’s console and type <code>Em.TEMPLATES</code>. You should see a hash containing all of the compiled templates.</p>
    <p>Be aware that Ember.js doesn’t need the template file’s complete path, nor the file’s extension. In other words, the template’s name should be <code>users/create</code>, not <code>/assets/js/templates/users/create.hbs</code>.</p>
    <p>Both plugins have options to handle this. Simply refer to the respective guide, or look at the Gists linked to above. You should end up with something like this:</p>
    <p><img src="http://media.smashingmagazine.com/wp-content/uploads/2013/09/console-templates.png" alt="console-templates" width="500" height="271" style="max-width: 100%; height: auto;"></p>
    <p>And this is exactly what we need to make everything work as intended. It’s all you need to know about precompiling with Grunt.</p>
    <h4>Precompiling With Rails</h4>
    <p>Precompiling with Rails is surely the easiest way to do it. The <a href="https://github.com/emberjs/ember-rails" rel="nofollow external" class="bo">Ember-Rails gem</a> handles pretty much everything for you. It <em>almost</em> works out of the box. Carefully follow the installation instructions in the <code>readme</code> file on GitHub, and you should be all good. Right now, in my humble opinion, Rails has the best Ember and Handlebars integration available.</p>
    <h3>Tools, Tips And Resources</h3>
    <h4>Chrome Ember Extension</h4>
    <p><a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi" rel="nofollow external" class="bo">Ember Extension</a> is a very convenient Chrome extension. Once installed, an “Ember” tab will appear near the “Console” tab. Then, you can navigate through controllers, routes and views. And the “Data” tab will greatly help you to explore your records if you are using Ember-Data.</p>
    <p><a href="http://media.smashingmagazine.com/wp-content/uploads/2013/08/console-ember-extension1.png" rel="nofollow external" class="bo"><img alt="console-ember-extension" src="http://media.smashingmagazine.com/wp-content/uploads/2013/08/console-ember-extension1-300x156.png" width="300" height="156" style="max-width: 100%; height: auto;"></a><br>
    <em>Exploring your app’s objects has never been so easy.</em></p>
    <h4>Ember App Kit</h4>
    <p>Maintained by the Ember team, the <a href="http://iamstef.net/ember-app-kit/" rel="nofollow external" class="bo">Ember App Kit</a> lets you easily scaffold Ember.js apps. It contains <a href="http://gruntjs.com/" rel="nofollow external" class="bo">Grunt</a> for compiling assets, <a href="http://www.jshint.com/" rel="nofollow external" class="bo">JSHint</a>, <a href="http://qunitjs.com/" rel="nofollow external" class="bo">QUnit</a>, the <a href="http://karma-runner.github.io/0.10/index.html" rel="nofollow external" class="bo">Kharma</a> test runner, <a href="http://bower.io/" rel="nofollow external" class="bo">Bower</a> and <a href="http://wiki.ecmascript.org/doku.php?id=harmony:modules" rel="nofollow external" class="bo">ES6 Modules</a> support.</p>
    <h4>Ember Tools</h4>
    <p>This GitHub project, <a href="https://github.com/rpflorence/ember-tools" rel="nofollow external" class="bo">Ember Tools</a>, is a basic command-line interface for creating and scaffolding Ember apps. Take a minute to watch the animated GIF in the <code>readme</code> file, and you’ll see why it’s so cool.</p>
    <h4>Development and Minified Version</h4>
    <p>Always use the development build when developing because it contains a lot of comments, a unit-testing package and a ton of helpful error messages, all of which has been removed in the minified build. Find links to both in the builds section of the <a href="http://emberjs.com/builds" rel="nofollow external" class="bo">Ember.js website</a>.</p>
    <h4>Debugging Tips</h4>
    <p>Ember.js usually gives you cool human-readable errors in the browser’s console (remember to use the development version). Sometimes, though, figuring out what’s going on is tricky. Some convenient methods are <code>{{log something}}</code> and <code>{{controller}}</code>, which helpfully prints the current <code>controller</code> for the template to which you’ve added this helper.</p>
    <p>Or you could log each <code>Router</code> transition like so:</p>
    <pre><code>&#x000A;    window.App = Ember.Application.create({&#x000A;      LOG_TRANSITIONS: true&#x000A;    });&#x000A;    </code></pre>
    <p>The guides have an <a href="http://emberjs.com/guides/understanding-ember/debugging" rel="nofollow external" class="bo">exhaustive list</a> of these handy little methods.</p>
    <h4>Properly Comment Your Handlebars</h4>
    <p>This one can be frustrating. Never ever comment a Handlebars tag with a regular HTML comment. If you do, you’ll completely break the app, without getting a clue about what’s happening.</p>
    <pre><code>&#x000A;    // never do this&#x000A;    &lt;!-- {{foo}} --&gt;&#x000A;    &#x000A;    // instead do this&#x000A;    {{!foo}}&#x000A;    </code></pre>
    <h3>Conclusion</h3>
    <p>I hope this <em>long</em> article has given you a better understanding of this awesome framework. But the truth is, we’ve only scratched the surface. There’s so much more to cover. For instance, we have the router and its asynchronous nature, which resolves model requests with promises (so that you can easily implement loading spinners). There is also the object model, with its class and instances inheritance, mixins, observers, filters, macros, collectionViews, components, dependencies managed between controllers, and testing package. And so much more!</p>
    <p>Obviously, I couldn’t cover everything. Fortunately, the guides will take you through all of these topics very well.</p>
    <p>Happy Ember.js coding, folks!</p>
    <h4>Resources</h4>
    <ul>
    <li>
    <a href="http://emberjs.com/guides/" rel="nofollow external" class="bo">Ember.js Guides</a><br>
    The best place to learn Ember</li>
    <li>
    <a href="http://emberjs.com/guides/cookbook/" rel="nofollow external" class="bo">Ember.js Cookbook</a><br>
    A new section of the guides that solves very specific use cases</li>
    <li>
    <a href="http://emberwatch.com" rel="nofollow external" class="bo">EmberWatch</a><br>
    Aggregates all important resources out there</li>
    <li>
    <a href="http://emberweekly.com/issues.html" rel="nofollow external" class="bo">Ember Weekly</a><br>
    Perfect for keeping up to date</li>
    <li>
    <a href="http://discuss.emberjs.com" rel="nofollow external" class="bo">Ember.js Discussion Forum</a><br>
    Where discussion happens (and it’s made with Ember.js)</li>
    </ul>
    <h4>Acknowledgments</h4>
    <p>Huge thanks to <a href="https://twitter.com/MatBreton" rel="nofollow external" class="bo">Mathieu Breton</a> and <a href="https://twitter.com/ficastelli" rel="nofollow external" class="bo">Philippe Castelli</a>, who both taught me everything they know about Ember.js while I was learning it. Also, a big thank you to <a href="https://twitter.com/tomdale" rel="nofollow external" class="bo">Tom Dale</a>, who helped me to revise this very long article.</p>
    <p><em>(al, il)</em></p>
    <hr>
    <p><small>© Julien Knebel for <a href="http://www.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Magazine</a>, 2013.</small></p>
    </div>
]]>
</Body>
<Summary>        With the release of Ember.js 1.0, it’s just about time to consider giving it a try. This article aims to introduce Ember.js to newcomers who want to learn about this framework.   Users...</Summary>
<Website>http://www.smashingmagazine.com/2013/11/07/an-in-depth-introduction-to-ember-js/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38082/guest@my.umbc.edu/b448c44b9978da063d062b522a1c2c13/api/pixel</TrackingUrl>
<Tag>coding</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 06:14:13 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="38081" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38081">
<Title>The beginner&#8217;s guide to Sass</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2013/09/thumbnail39.jpg" width="200" height="160" style="max-width: 100%; height: auto;">You may have heard of CSS preprocessing and be wondering what all the buzz is about. You may even have heard of <a href="http://sass-lang.com/" rel="nofollow external" class="bo">Sass</a> or <a href="http://lesscss.org/" rel="nofollow external" class="bo">LESS</a>.</p> <p>In short, preprocessing your CSS allows you to write more concise stylesheets which are formatted nicely and require less repetitive techniques commonly found when writing CSS code. The result is more dynamic styling and ample amounts of time saved when developing websites or applications.</p> <p>If you already write CSS, then you can easily learn to preprocess your CSS. Once you understand the scope of Sass, you’ll wonder why you didn’t switch sooner.</p> <h1>How is Sass different to CSS?</h1> <p>Sass looks similar to CSS but has its obvious differences once you dive in. There are two ways of writing Sass and it’s ultimately up to you which style you prefer. I use the indented and bracketed style (.scss) in my projects because I like to really visualize where a block ends and begins when a lot of code becomes nested. Once processed the Sass code compiles to traditional CSS automatically using a preprocessing engine.</p> <p>There are many apps available which allow precompiling your Sass to be seamless and downright easy. To install, you can use the command line as long as you have Ruby installed on your machine. If you’re not comfortable with the command line there are other options (more on this below) and if this is over your head visit Sass-lang.com to learn how to do this in an easy step-by-step format. In the end, using any method be it command line or app, the Sass installation will watch your changes and automatically compile down to traditional CSS for you.</p> <p>I highly recommend using apps such as <a href="http://incident57.com/codekit/" rel="nofollow external" class="bo">Codekit</a>, <a href="http://livereload.com/" rel="nofollow external" class="bo">LiveReload</a>, or <a href="http://mixture.io/" rel="nofollow external" class="bo">Mixture</a> which help you set up a Sass project on a Mac from scratch or if you’re a Windows user I recommend <a href="http://alphapixels.com/prepros/" rel="nofollow external" class="bo">PrePros</a>. Codekit, my choice of preprocessor, helps me by preprocessing my Sass as well as validating and minifying your code to allow your website to run quickly and effectively. (The ability to create <a href="http://compass-style.org/" rel="nofollow external" class="bo">Compass</a> or <a href="http://bourbon.io/" rel="nofollow external" class="bo">Bourbon</a> based projects within Codekit is also an awesome feature but is beyond the scope of this article.) After you get more comfortable with Sass be sure to check out how to use Compass and Bourbon in your Sass projects.</p> <p> </p> <h1>So what is Sass?</h1> <p>Sass stands for Syntactically Awesome Stylesheets and was created by <a href="http://www.hamptoncatlin.com/" rel="nofollow external" class="bo">Hampton Catlin</a>. Sass introduces new concepts like variables, mixins, and nesting into the CSS code you already know and love. These concepts ultimately make your CSS awesome, easier to write and more dynamic. All of these features combined, speed up any designer’s or developer’s workflow.</p> <p>What commonly confuses people is the alternative ways to write Sass. You will see other tutorials or explanations of Sass using the .SCSS or the .Sass extension for their Sass files. This is apparent because there are two ways of writing the code which produce the same output. The most common I’ve seen, and the method I currently use is the bracketed version known as .SCSS. Another method is the .Sass extension which relies more heavily on indentation rather than punctual elements and is white space dependent. With this syntax there’s no need for semi-colons or brackets as you see in CSS and the .SCSS syntax.</p> <p>Check out the example below.</p> <h2>.CSS</h2> <pre>#container {<br>        width:960px;<br>        margin:0 auto;<br>}<br>#container p {<br>       color: black;<br>}</pre> <h2>.SCSS</h2> <pre>/* Same as CSS but has variables and nesting. */<br>$black: #000000;<br>#container {<br>        width:960px;<br>        margin:0 auto;<br>        p {<br>                color :$black;<br>        }<br>}</pre> <h2>.Sass</h2> <pre>/* Same as SCSS without semicolons, brackets, and more dependent on indentation. */<br>$black: #000000<br>#container<br>        width:960px<br>        margin: 0 auto<br>        p<br>              color:$black</pre> <p> </p> <h1>Structure</h1> <p>Okay so now you’re probably wondering how to get Sass setup for your own projects. The process is pretty easy, especially if you use Codekit or a similar application to help you along the way.</p> <p>A typical file structure of a Sass project looks like the outline below. This may look daunting but I promise that your workflow will improve once you wrap your head around how things work together. In the end all of your Sass gets compiled down to one CSS file which will be the file you include inside your working documents be it HTML, PHP, etc…</p> <pre>stylesheets/<br>|<br>|-- modules/ # Common modules<br>| |-- _all.scss # Global level styles<br>| |-- _utility.scss # Basic utility styles<br>| |-- _colors.scss # Global Colors<br>| ...<br>|<br>|-- partials/ # Partials - use these to target specific styles and @import on _base.scss<br>| |-- _base.scss # imports for all mixins + global project variables<br>| |-- _buttons.scss # buttons<br>| |-- _figures.scss # figures<br>| |-- _grids.scss # grids<br>| |-- _typography.scss # typography<br>| |-- _reset.scss # reset<br>| ...<br>|<br>|-- vendor/ # CSS or Sass from other projects<br>| |-- _colorpicker.scss<br>| |-- _jquery.ui.core.scss<br>| ...<br>|<br>|-- main.scss # primary Sass file - where your main Sass code will likely be.</pre> <p>How you set your structure up ultimately depends on you. Start with a basic structure and fine tune to your own needs and workflow.</p> <p> </p> <h1>@Import</h1> <p>Sass extends the CSS <em>@import</em> rule to allow it to import Sass and SCSS files. All imported files are merged into a single outputted CSS file. In addition, any variables or mixins defined in imported files carry over into the main file which means you can virtually mix and match any file and be certain all of your styles will remain on a global level.</p> <p>@import takes a filename to import. As a last resort Sass or SCSS files will be imported via the file name of your choosing. If there is no extension, Sass will try to find a file with that name and the .scss or .Sass extension and import it.</p> <p>If you have a typical Sass project setup you’ll notice some @import rules within a base file. This simply allows you to have multiple files which sync effectively once they are compiled, for example:</p> <pre>@import "main.scss";</pre> <p>or:</p> <pre>@import "main";<br>@Partials</pre> <p>If you have a SCSS or Sass file that you want to import but not compile to CSS, you can add an underscore to the beginning of the filename, which is otherwise known as a Partial. As the code is compiling Sass will ignore partials when processing to CSS. For example, you might have _buttons.scss, no _buttons.css file would be created and you can then <em>@import “buttons”;</em></p> <p>Best practice is to create a partials directory and place all of your partial Sass files inside it. Doing this insures you won’t have any duplicate file names which Sass will not permit, for example, the partial _buttons.scss and the file buttons.scss can’t exist in the same directory. Using partials is a great way to stay organized at a global level. As long as you @import the file, the Sass you write is usable throughout the entire project. Typically inside partials I create mixins or variables to use throughout my project. I name them based on their contents and the elements they are styling.</p> <p> </p> <h1>Variables</h1> <p>Variables in CSS are a breakthrough in modern web development. With Sass you can create variables for things such as fonts, colors, sizes, margin, padding, etc… The list is endless. If you write JavaScript or PHP the concept is fairly similar in terms of defining variables and conventions.</p> <p>So why use variables? Easy, variables allow you to use an element more than once, similar to a class in HTML or a variable in JavaScript. For example, say you define multiple divs with a specific background color. You can use the variable which is easier to remember instead of the traditional hex code or RGB calculation. Making a variable with an easy to remember name allows for less copy and pasting and a more productive workflow. The same concept applies whenever a variable can be implemented, and with Sass that is virtually anywhere, for example this .scss:</p> <pre>#container {<br><br>        /* Here we define our variables */<br>        $basetextsize: 12px;<br>        $container-space: 10px;<br>        $red: #C0392B;<br><br>        /* Variables are applied */<br>        font-size: $basetextsize;<br>        padding: $container-space;<br>        color : $red;<br>}</pre> <p>will result in this .css file:</p> <pre>#container {<br>        font-size: 12px;<br>        padding: 10px;<br>        color: #C0392B;<br>}</pre> <p> </p> <h1>Operations and functions</h1> <p>The cool part about variables is that they are extremely similar to those used in scripting languages. Variables inside Sass can be used inside both operations and functions. The standard math operations (+, -, *, / and %) are supported for numbers. For colors there are functions built into Sass which target lightness, hue, saturation, and more.</p> <p>Having this functionality makes your code more dynamic than ever. For example, If you wanted to change the overall link color of your site you could simply change the variable, re-compile, and your site will update dynamically throughout. Check out another example below for a reusable navigation list, this .scss:</p> <pre>nav <br>{<br>        $nav-width: 900px;<br>        $nav-links: 5;<br>        $nav-color: #ce4dd6;<br>        width: $nav-width;<br>        li <br>        {<br>                float: left;<br>                width: $nav-width/$nav-links - 10px;<br>                background-color:<br>                lighten($nav-color, 20%);<br>                &amp;:hover<br>                {<br>                        background-color:<br>                        lighten ($nav-color, 10%);<br>                }<br>        }<br>}</pre> <p>will result in this .css:</p> <pre>nav {<br>        width: 900px;<br>}<br>nav li {<br>        float:left;<br>        width: 170px;<br>        background-color: #E5A0E9;<br>}<br>nav li:hover {<br>        background-color: #D976E0;<br>}</pre> <p> </p> <h1>Nesting</h1> <p>Nesting is a huge reason why I love Sass. You write fewer lines of code in the end and all of your code is easy to read due to the nested formatting. (The same concept of nesting is also found in LESS.)</p> <p>There are two types of nesting:</p> <h2>Selector nesting</h2> <p>Selector nesting in Sass is similar to how you would nest HTML:</p> <pre>&lt;div id="container"&gt;<br>        &lt;div class="main"&gt;<br>                &lt;h1&gt;Main Content&lt;/h1&gt;<br>        &lt;/div&gt;<br>        &lt;aside class="sidebar"&gt;<br>                &lt;h3&gt;Sidebar Content&lt;/h3&gt;<br>        &lt;/aside&gt;<br>&lt;/div&gt;</pre> <p>The Sass version of nesting:</p> <pre>#container {<br>        .main {<br>                width:600px;<br>                h1 {<br>                        color: $red;<br>                }<br>        }<br>        .sidebar {<br>                width: 300px;<br>                h3 {<br>                        margin: 0;<br>                }<br>        }<br>}</pre> <p>would result in the following CSS:</p> <pre>#container .main {<br>        width: 960px;<br>}<br>#container .main h1 {<br>        color: #C0392B;<br>}<br>#container .sidebar {<br>        width: 300px;<br>}<br>#container .sidebar h3 {<br>        margin: 0;<br>}</pre> <h2>Property nesting</h2> <p>The second type of nesting is property nesting. You can nest properties with the same prefix to better target elements which results in less lines of code, for example this:</p> <pre>#container {<br>        .main {<br>                font:<br>                        weight: bold;<br>                        size: 12px;<br>                .intro {<br>                        font:<br>                        size: 20px;<br>                }<br>        }<br>}</pre> <p>would result in this CSS:</p> <pre>#container .main {<br>        font-weight:bold;<br>        font-size: 12px;<br>}<br>#container .main .intro {<br>        font-size:20px;<br>}</pre> <p> </p> <h1>Mixins</h1> <p>Of all of the Sass features Mixins have to be the most powerful. Mixins are similar to a variable but on steroids. You can define a complete style of an element and re-use those styles throughout your project.</p> <p>Mixins are defined using the <em>@mixin</em> directive, which takes a block of styles you created before and applies it to the selector of your choice using the <em>@include</em> directive. Below is a common CSS pattern used for creating a horizontal navigation menu. Instead of writing the same code for every navigation instance, just use a mixin and later include it where necessary. This concept can be done for anything you use over and over such as buttons, typography, gradients, etc…</p> <pre>/* Here we define the styles */<br>@mixin navigate {<br>        list-style-type:none;<br>        padding:0;<br>        margin:0;<br>        overflow:hidden;<br>        &gt; li {<br>                display:block;<br>                float:left;<br>                &amp;:last-child{<br>                margin-right:0px;<br>                }<br>        }<br>}</pre> <p>And here we include the mixin with one line of code:</p> <pre>ul.navbar {<br>        @include navigate;<br>}</pre> <p>which results in this compiled CSS:</p> <pre>ul.navbar {<br>        list-style-type: none;<br>        padding:0;<br>        margin:0;<br>        overflow: hidden;<br>}<br>ul.navbar li {<br>        display: block;<br>        float: left;<br>}<br>ul.navbar li:last-child {<br>        margin-right: 0px;<br>}</pre> <p>You can even go as far as creating customizable mixins which use arguments to update dynamically. On top of that you can include mixins within other mixins or create functions using mixins and more. The power behind these is absolutely huge.</p> <p>There are some popular pre-defined mixin collections in which I mentioned earlier called Compass and Bourbon. With a simple <em>@import</em> in your project you can have access to already generated mixins commonly used throughout the web. There are so many options that it’s hard to cover everything available but it is definitely fun to experiment and get your hands dirty developing custom animations or transitions with a few lines of code rather than a screen full. Mixins make cross browser development a breeze if you don’t feel like typing browser defined prefixes over and over inside your CSS.</p> <p>For example, here we create a mixin with arguments allowing it to be customized.</p> <pre>@mixin my-border($color, $width) {<br>        border: {<br>                color: $color;<br>                width: $width;<br>                style: $dashed;<br>        }<br>}<br>p { @include my-border (blue, lin); }</pre> <p>which gives us this CSS when it’s compiled:</p> <pre>p {<br>        border-color: blue;<br>        border-width: lin;<br>        border-style: dashed;<br>}</pre> <p> </p> <h1>Summary</h1> <p>While Sass has a learning curve, I truly believe that once you understand the methods and syntax, you’ll never want to go back to writing standard CSS again.</p> <p>Sass is extremely powerful and I have only covered the basics here. With traditional CSS, we’ve all encountered the copy and pasting or find and replacing tasks which waste so much time in the development stage of your project. Give Sass a try and discover how to build an effective workflow in your future projects.</p> <p> </p> <p><em><strong>Do you use Sass, or favor a different CSS preprocessor? Do you have a favorite mixin? Let us know in the comments.</strong></em></p> <p><em>Featured image/thumbnail, uses <a href="http://www.shutterstock.com/pic-88988794/stock-photo-child-in-superhero-suit.html" rel="nofollow external" class="bo">zero to hero image</a> via Shutterstock.</em></p> <p><br><br> </p>
    <table width="100%"> <tbody>
    <tr> <td> <a href="http://www.mightydeals.com/deal/magpress.html?ref=inwidget" rel="nofollow external" class="bo"><strong>MagPress Plugin: Convert any WP Blog to an eBook – only $24!</strong></a> </td> <td> <a href="http://www.mightydeals.com/?ref=inwidget" rel="nofollow external" class="bo"><br> <img src="http://mightydeals.com/web/images/widget-logo.png" height="40" width="90" alt="The beginners guide to Sass" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2013/11/the-beginners-guide-to-sass/" rel="nofollow external" class="bo">Source</a> <br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F11%2Fthe-beginners-guide-to-sass%2F&amp;t=The+beginner%E2%80%99s+guide+to+Sass" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F11%2Fthe-beginners-guide-to-sass%2F&amp;t=The+beginner%E2%80%99s+guide+to+Sass" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F11%2Fthe-beginners-guide-to-sass%2F&amp;t=The+beginner%E2%80%99s+guide+to+Sass" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F11%2Fthe-beginners-guide-to-sass%2F&amp;t=The+beginner%E2%80%99s+guide+to+Sass" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F11%2Fthe-beginners-guide-to-sass%2F&amp;t=The+beginner%E2%80%99s+guide+to+Sass" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/180263789732/u/49/f/661066/c/35285/s/336680cc/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/180263789732/u/49/f/661066/c/35285/s/336680cc/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>You may have heard of CSS preprocessing and be wondering what all the buzz is about. You may even have heard of Sass or LESS.   In short, preprocessing your CSS allows you to write more concise...</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/336680cc/sc/4/l/0L0Swebdesignerdepot0N0C20A130C110Cthe0Ebeginners0Eguide0Eto0Esass0C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38081/guest@my.umbc.edu/e8f7ada7b539c7c0440762f013640e66/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>css</Tag>
<Tag>css-prepocessor</Tag>
<Tag>css-preprocessing</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>guide-to-sass</Tag>
<Tag>how-to-use-sass</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>javascript</Tag>
<Tag>less</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>sass</Tag>
<Tag>sql</Tag>
<Tag>super-css</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 03:15:38 -0500</PostedAt>
<EditAt>Thu, 07 Nov 2013 03:15:38 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="38086" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38086">
<Title>C.I.A. Is Said to Pay AT&amp;T for Call Data</Title>
<Body>
<![CDATA[
    <div class="html-content">The disclosure shows that agencies beyond the N.S.A. exploit call metadata with programs regulated by an inconsistent patchwork of legal standards, procedures and oversight.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F07%2Fus%2Fcia-is-said-to-pay-att-for-call-data.html%3Fpartner%3Drss%26emc%3Drss&amp;t=C.I.A.+Is+Said+to+Pay+AT%26T+for+Call+Data" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F07%2Fus%2Fcia-is-said-to-pay-att-for-call-data.html%3Fpartner%3Drss%26emc%3Drss&amp;t=C.I.A.+Is+Said+to+Pay+AT%26T+for+Call+Data" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F07%2Fus%2Fcia-is-said-to-pay-att-for-call-data.html%3Fpartner%3Drss%26emc%3Drss&amp;t=C.I.A.+Is+Said+to+Pay+AT%26T+for+Call+Data" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F07%2Fus%2Fcia-is-said-to-pay-att-for-call-data.html%3Fpartner%3Drss%26emc%3Drss&amp;t=C.I.A.+Is+Said+to+Pay+AT%26T+for+Call+Data" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F11%2F07%2Fus%2Fcia-is-said-to-pay-att-for-call-data.html%3Fpartner%3Drss%26emc%3Drss&amp;t=C.I.A.+Is+Said+to+Pay+AT%26T+for+Call+Data" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>The disclosure shows that agencies beyond the N.S.A. exploit call metadata with programs regulated by an inconsistent patchwork of legal standards, procedures and oversight.      </Summary>
<Website>http://www.nytimes.com/2013/11/07/us/cia-is-said-to-pay-att-for-call-data.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38086/guest@my.umbc.edu/53c8c1cad9b6804a2c97414866d33f54/api/pixel</TrackingUrl>
<Tag>at-and-t-inc-t-nyse</Tag>
<Tag>central-intelligence-agency</Tag>
<Tag>national-security-agency</Tag>
<Tag>new</Tag>
<Tag>privacy</Tag>
<Tag>regulation-and-deregulation-of-industry</Tag>
<Tag>surveillance-of-citizens-by-government</Tag>
<Tag>technology</Tag>
<Tag>telephones-and-telecommunications</Tag>
<Tag>vodafone-group-plc-vod-nasdaq</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 02:30:12 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="38105" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38105">
<Title>2013-14 Women's Basketball Season Outlook</Title>
<Body>
<![CDATA[
    <div class="html-content">In his 11 seasons in Baltimore, head coach Phil Stern has faced many tough challenges throughout his career at UMBC. This season proves to be no different, as many observing the revitalized UMBC women's basketball team will undoubtedly have to watch with a roster in hand. Stern's squad features nine newcomers, while returning just one senior and a trio of sophomores.</div>
]]>
</Body>
<Summary>In his 11 seasons in Baltimore, head coach Phil Stern has faced many tough challenges throughout his career at UMBC. This season proves to be no different, as many observing the revitalized UMBC...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8298</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38105/guest@my.umbc.edu/92b6c3d5397780659a85a6a90e96e4e8/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 00:00:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="38092" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38092">
<Title>Pete Caringi III Earns 2013 America East Men's Soccer Fans' Choice Player of the Year</Title>
<Body>
<![CDATA[
    <div class="html-content">CAMBRIDGE, Mass. -Earning 2,002 of the 5,523 total votes, UMBC senior striker Pete Caringi III (Perry Hall, Md./Calvert Hall) earned the 2013 America East Men's Soccer Fans' Choice Player of the Year award.
    
    
    Caringi III received 36 percent of the vote, just barely edging out New Hampshire's Ugochukwu Uche who had 35 percent and a total of 1,906 votes. Caringi is the first repeat winner (2012 &amp; 2013)in the five-year history of the award.</div>
]]>
</Body>
<Summary>CAMBRIDGE, Mass. -Earning 2,002 of the 5,523 total votes, UMBC senior striker Pete Caringi III (Perry Hall, Md./Calvert Hall) earned the 2013 America East Men's Soccer Fans' Choice Player of the...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8295</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38092/guest@my.umbc.edu/8b5e91b11eddcf1b321547bca675130f/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 00:00:00 -0500</PostedAt>
<EditAt>Thu, 07 Nov 2013 00:00:00 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="38095" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38095">
<Title>Volleyball Begins End of Season Road Swing at New Hampshire, UMass Lowell</Title>
<Body>
<![CDATA[
    <div class="html-content">BALTIMORE � After earning two victories on its last home weekend of the regular season, the UMBC volleyball team begins its end of the season road swing with matches against New Hampshire and league newcomer UMass Lowell.  The Retrievers will take on the Wildcats on Friday evening in Durham, N.H. at 7:00 p.m. before heading across the state line to take on the River Hawks in Lowell, Mass. on Sunday at 11:00 a.m.</div>
]]>
</Body>
<Summary>BALTIMORE � After earning two victories on its last home weekend of the regular season, the UMBC volleyball team begins its end of the season road swing with matches against New Hampshire and...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8296</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38095/guest@my.umbc.edu/9c8e838a302beef4cf4e2a674691c210/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 00:00:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="38099" important="false" status="posted" url="https://my3.my.umbc.edu/posts/38099">
<Title>Women's Soccer Hosts No. 2 Stony Brook in AEC Title Game</Title>
<Body>
<![CDATA[
    <div class="html-content">The top-seeded UMBC women's soccer team looks to add another first to its historic season as it competes in its first America East Championship game on Saturday, Nov. 9 when they host No. 2 Stony Brook. The black and gold will look to hold off the Seawolves from garnering back-to-back tournament titles, while the Retrievers look for their first tournament title in program history.</div>
]]>
</Body>
<Summary>The top-seeded UMBC women's soccer team looks to add another first to its historic season as it competes in its first America East Championship game on Saturday, Nov. 9 when they host No. 2 Stony...</Summary>
<Website>http://www.umbcretrievers.com/release.asp?RELEASE_ID=8297</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/38099/guest@my.umbc.edu/863d09ef5d7c2979b29aa50ee35b6edd/api/pixel</TrackingUrl>
<Group token="athletics">UMBC Athletics</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/athletics</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/original.jpg?1709304849</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xlarge.png?1709304849</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/large.png?1709304849</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/medium.png?1709304849</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/small.png?1709304849</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xsmall.png?1709304849</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/009/69595c9b99f609d75fbb8232d9bd73d3/xxsmall.png?1709304849</AvatarUrl>
<Sponsor>UMBC Athletics</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 07 Nov 2013 00:00:00 -0500</PostedAt>
</NewsItem>

</News>
