<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ember Blog</title>
  <subtitle>Ember News and Updates</subtitle>
  <id>http://emberjs.com/blog</id>
  <link href="http://emberjs.com/blog"/>
  <link href="http://emberjs.com/blog/feed.xml" rel="self"/>
  <updated>2016-10-17T00:00:00+00:00</updated>
  <author>
    <name>Ember</name>
  </author>
  <entry>
    <title>Ember.js 2.8-LTS, 2.9 and 2.10 Beta Released</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/10/17/ember-2-9-released.html"/>
    <id>http://emberjs.com/blog/2016/10/17/ember-2-9-released.html</id>
    <published>2016-10-17T00:00:00+00:00</published>
    <updated>2016-10-17T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;Today, we are releasing Ember 2.8-LTS (a long-term support release), Ember 2.9.0 and Ember 2.10 beta.&lt;/p&gt;
&lt;h2 class="anchorable-toc" id="toc_ember-js-2-8-lts"&gt;Ember.js 2.8-LTS&lt;/h2&gt;
&lt;p&gt;Ember 2.8-LTS is our second long-term support release. You can install it by running &lt;code&gt;bower install --save ember#lts-2-8&lt;/code&gt; in your projects...&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Today, we are releasing Ember 2.8-LTS (a long-term support release), Ember 2.9.0 and Ember 2.10 beta.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_ember-js-2-8-lts'&gt;Ember.js 2.8-LTS&lt;/h2&gt;
&lt;p&gt;Ember 2.8-LTS is our second long-term support release. You can install it by running &lt;code&gt;bower install --save ember#lts-2-8&lt;/code&gt; in your projects.&lt;/p&gt;

&lt;p&gt;The LTS channel is designed for Ember users who would like to upgrade less frequently, while still getting support from the project and the wider ecosystem. At the same time, it allows addon authors to know which versions of Ember to focus their effort on.&lt;/p&gt;

&lt;p&gt;Per our &lt;a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html"&gt;usual policy&lt;/a&gt;, Ember 2.8-LTS is released six weeks after the &lt;a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-8"&gt;2.8.0 stable release&lt;/a&gt;. This allows ample time to fix any reported regressions and ensures a rock solid LTS release. It will continue to receive critical bugfixes for six release cycles (roughly June 2017), and security patches for ten release cycles (roughly February 2018).&lt;/p&gt;

&lt;p&gt;Meanwhile, Ember 2.4-LTS will continue to receive critical bugfixes for another two release cycles (roughly January 2017), and security patches for six release cycles (roughly June 2017). Users of Ember 2.4-LTS should make use of this overlapping period to transition over to Ember 2.8-LTS.&lt;/p&gt;

&lt;p&gt;Most notably, as we have mentioned in the &lt;a href="http://emberjs.com/blog/2016/04/11/ember-2-5-released.html#toc_notable-deprecations-in-ember-2-4-lts"&gt;Ember 2.4-LTS announcement&lt;/a&gt;, applications who are using the legacy views and controllers addons will need to migrate away from these addons before they can upgrade.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on the changes landing in Ember.js 2.8-LTS, please review the &lt;a href="https://github.com/emberjs/ember.js/blob/v2.8.2/CHANGELOG.md"&gt;Ember.js 2.8.2 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_ember-js-2-9'&gt;Ember.js 2.9&lt;/h2&gt;
&lt;p&gt;In the &lt;a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-9-beta"&gt;Ember 2.9 beta blog post&lt;/a&gt;, we announced our intention to include the new Glimmer 2 rendering engine in the 2.9 release. However, after careful consideration, we have decided to temporarily hold off on the integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This means that 2.9 will ship with the same rendering engine as 2.8 and does not include any new features, notable changes or deprecations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we moved ahead with Glimmer in the 2.9 beta channel in September, all of Ember&amp;#39;s tests were passing, we had no known blockers and it was already working fine for a number of apps we tested (including some core team member&amp;#39;s production apps). Due to the magnitude of the internal changes, we fully expected to find bugs not already covered by our initial testing, so we called for the community to beta test the release.&lt;/p&gt;

&lt;p&gt;We got a lot of positive results during the beta period, and some of our community sites (such as &lt;a href="https://emberobserver.com/"&gt;Ember Observer&lt;/a&gt; and &lt;a href="https://www.emberaddons.com/"&gt;Ember Addons&lt;/a&gt;) have already migrated to using the beta in production. However, as more apps tested the beta, we began to see a few critical edge cases reported during the mid-to-late part of the beta cycle. We were able to fix a number of them, but at this point, there are still a &lt;a href="https://github.com/emberjs/ember.js/milestone/29"&gt;handful of open issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As we said in the &lt;a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_compatibility-first"&gt;Ember 2.9 beta announcement&lt;/a&gt;, the &amp;quot;primary goal of this release is maximal compatibility – &lt;strong&gt;we expect the final release to be a drop-in, completely backwards compatible upgrade for virtually all Ember users&lt;/strong&gt;&amp;quot;. Therefore, we decided to err on the side of caution and take another six weeks to ensure the smoothest possible experience for our users.&lt;/p&gt;

&lt;p&gt;While it is quite rare for a feature to be backed out from the beta channel, we consider the ability to do so a strength of our &lt;a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html#toc_the-beta-branch"&gt;release process&lt;/a&gt;, and we would like to thank everyone who took the time to test their application against the beta channel.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on the changes landing in Ember.js 2.9, please review the &lt;a href="https://github.com/emberjs/ember.js/blob/v2.9.0/CHANGELOG.md"&gt;Ember.js 2.9.0 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_ember-js-2-10-beta'&gt;Ember.js 2.10 beta&lt;/h2&gt;
&lt;p&gt;As mentioned above, we will continue the Glimmer 2 integration work in Ember 2.10 beta, with a focus on resolving the &lt;a href="https://github.com/emberjs/ember.js/milestone/29"&gt;remaining compatibility issues&lt;/a&gt;. You can &lt;a href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html#toc_ember-js-2-9-beta"&gt;read about the integration&lt;/a&gt; in the original announcement.&lt;/p&gt;

&lt;p&gt;If you haven&amp;#39;t already, we highly encourage you to test your application against 2.10 beta as soon as possible and report any issues you encounter. Given that it already went through a complete beta cycle and we were quite close to releasing it, we expect this to go smoothly for most apps.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on changes landing in 2.10 beta, review the &lt;a href="https://github.com/emberjs/ember.js/blob/v2.10.0-beta.1/CHANGELOG.md"&gt;Ember.js 2.10.0-beta.1 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Ember.js 2.8 and 2.9 Beta Released</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html"/>
    <id>http://emberjs.com/blog/2016/09/08/ember-2-8-and-2-9-beta-released.html</id>
    <published>2016-09-08T00:00:00+00:00</published>
    <updated>2016-09-08T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;Today, the Ember core team is happy to announce two new Ember.js releases –
Ember.js 2.8 and Ember.js 2.9 beta.&lt;/p&gt;
&lt;h2 class="anchorable-toc" id="toc_ember-js-2-8"&gt;Ember.js 2.8&lt;/h2&gt;
&lt;p&gt;Ember.js 2.8 is a minor release with only backwards compatible changes.&lt;/p&gt;
&lt;h3 class="anchorable-toc" id="toc_lts-candidate"&gt;LTS Candidate&lt;/h3&gt;
&lt;p&gt;The Ember.js 2.8 release is considered...&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Today, the Ember core team is happy to announce two new Ember.js releases –
Ember.js 2.8 and Ember.js 2.9 beta.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_ember-js-2-8'&gt;Ember.js 2.8&lt;/h2&gt;
&lt;p&gt;Ember.js 2.8 is a minor release with only backwards compatible changes.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_lts-candidate'&gt;LTS Candidate&lt;/h3&gt;
&lt;p&gt;The Ember.js 2.8 release is considered a release candidate for the LTS
(long-term support) channel. As described in the &lt;a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html"&gt;original LTS announcement&lt;/a&gt;,
the 2.8 branch will be moved into the LTS channel six weeks after today&amp;#39;s
release. Although we don&amp;#39;t anticipate any issues, this process ensures the LTS
releases will be rock solid.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_engines'&gt;Engines&lt;/h3&gt;
&lt;p&gt;Ember.js 2.8 introduced a new &lt;a href="https://github.com/emberjs/rfcs/pull/10"&gt;Engines&lt;/a&gt;
API, which allows multiple logical applications to be composed together into a
single application from the user&amp;#39;s perspective.&lt;/p&gt;

&lt;p&gt;The best way to use this feature in your apps is through the &lt;a href="http://github.com/dgeb/ember-engines"&gt;ember-engines addon&lt;/a&gt;.
To get started, check out the excellent &lt;a href="https://github.com/dgeb/ember-engines/blob/master/guides/01-introduction.md"&gt;guides&lt;/a&gt;
written by &lt;a href="https://github.com/trentmwillis"&gt;@trentmwillis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release introduced a set of low-level APIs for the core functionality
along with the usual semver guarantees. While the ember-engines addon itself
remains experimental, the introduction of these public APIs means that
&lt;strong&gt;ember-engines is now usable with Ember.js 2.8&lt;/strong&gt; without feature flags.&lt;/p&gt;

&lt;p&gt;Work on engines has proceeded over the past year in both Ember core as well as
the addon. Ember&amp;#39;s architecture has been enhanced to provide the base classes
and hooks needed to support engines. The addon then makes use of these
interfaces to provide a smooth experience building and consuming engines.&lt;/p&gt;

&lt;p&gt;Until now, none of the engine-related classes and hooks in Ember have been
exposed publicly. However, starting with Ember.js 2.8, the following APIs are
now public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.Engine&lt;/code&gt; class - The base class for &lt;code&gt;Ember.Application&lt;/code&gt;. Its only
public interface is related to initializers and instance initializers, which
is then inherited by applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.EngineInstance&lt;/code&gt; class - The base class for &lt;code&gt;Ember.ApplicationInstance&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;{{mount}}&lt;/code&gt; helper - Allows for the mounting of routeless engines in
templates. This helper currently only takes one argument, the name of the
engine, e.g. &lt;code&gt;{{mount &amp;quot;chat-engine&amp;quot;}}&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; router DSL - Allows routable engines to be mounted at a location in
a route map.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By making these APIs public, ember-engines and other addons will be able to
access them without a feature-flag. By accessing only public interfaces in
Ember, an addon won&amp;#39;t need to rely on private overrides and can provide as
stable an experience as possible.&lt;/p&gt;

&lt;p&gt;We predict that engines will grow in popularity once work on lazy loading is
complete. By delaying the loading of engines until they&amp;#39;re accessed, we can
decrease the initial payload size and startup time for applications. If you&amp;#39;re
interested in helping to implement or test lazy loading of engines, please
check out the thorough &lt;a href="https://github.com/dgeb/ember-engines/issues/154"&gt;attack plan&lt;/a&gt;
written up by &lt;a href="https://github.com/nathanhammond"&gt;@nathanhammond&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_other-notable-features'&gt;Other Notable Features&lt;/h3&gt;&lt;h4 class='anchorable-toc' id='toc_code-enumerable-includes-code-and-code-array-includes-code'&gt;&lt;code&gt;Enumerable#includes&lt;/code&gt; and &lt;code&gt;Array#includes&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In an effort to remain in line with ES standards, the methods &lt;code&gt;Enumerable#contains&lt;/code&gt;
and &lt;code&gt;Array#contains&lt;/code&gt; have been deprecated in favor of the new methods &lt;code&gt;Enumerable#includes&lt;/code&gt;
and &lt;code&gt;Array#includes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Addon authors should use &lt;a href="https://github.com/rwjblue/ember-runtime-enumerable-includes-polyfill"&gt;ember-runtime-enumerable-includes-polyfill&lt;/a&gt;
to fix the deprecation in a backwards-compatible way.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://github.com/alexspeller"&gt;@alexspeller&lt;/a&gt; for the &lt;a href="https://github.com/emberjs/rfcs/blob/master/text/0136-contains-to-includes.md"&gt;RFC&lt;/a&gt;
that proposed this change.&lt;/p&gt;

&lt;p&gt;Thanks as well to &lt;a href="https://github.com/bmeurant"&gt;@bmeurant&lt;/a&gt; for the &lt;a href="https://github.com/emberjs/ember.js/pull/13553"&gt;PR&lt;/a&gt;
that implemented the change.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-ember-string-ishtmlsafe-code'&gt;&lt;code&gt;Ember.String.isHTMLSafe&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new method &lt;code&gt;Ember.String.isHTMLSafe&lt;/code&gt; detects if a string was decorated
using &lt;code&gt;Ember.String.htmlSafe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight javascript "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; plainString = &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;plain string&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
    safeString = Ember.String.htmlSafe(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;&amp;lt;div&amp;gt;someValue&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;);

Ember.String.isHTMLSafe(plainString); &lt;span class="comment"&gt;// false&lt;/span&gt;
Ember.String.isHTMLSafe(safeString);  &lt;span class="comment"&gt;// true&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/workmanw"&gt;@workmanw&lt;/a&gt; for the &lt;a href="https://github.com/emberjs/rfcs/pull/139"&gt;RFC&lt;/a&gt;
that proposed this new API, as well as the &lt;a href="https://github.com/emberjs/ember.js/pull/13666"&gt;PR&lt;/a&gt;
that implemented it.&lt;/p&gt;

&lt;p&gt;On a related note, please create safe strings with &lt;code&gt;Ember.String.htmlSafe&lt;/code&gt;
instead of the using the deprecated &lt;code&gt;Ember.Handlebars.SafeString&lt;/code&gt;. See the
&lt;a href="http://emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring"&gt;deprecation guide&lt;/a&gt;
for details.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-ember-test-checkwaiters-code'&gt;&lt;code&gt;Ember.Test.checkWaiters&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new method &lt;code&gt;Ember.Test.checkWaiters&lt;/code&gt; provides a simple mechanism for test
tooling to determine whether all async test waiters have settled. This replaces
the intimate API &lt;code&gt;Ember.Test.waiters&lt;/code&gt;, which has been removed in Ember.js 2.8.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://github.com/rwjblue"&gt;@rwjblue&lt;/a&gt; and &lt;a href="https://github.com/krisselden"&gt;@krisselden&lt;/a&gt;
for implementing this method.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on the changes landing in Ember.js 2.8, review the &lt;a href="https://github.com/emberjs/ember.js/blob/v2.8.0/CHANGELOG.md"&gt;Ember.js 2.8.0 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_ember-js-2-9-beta'&gt;Ember.js 2.9 beta&lt;/h2&gt;
&lt;p&gt;Ember.js 2.9 beta is also being released today. Per our usual &lt;a href="http://emberjs.com/builds/#/beta"&gt;release cadence&lt;/a&gt;,
it will be released to the stable channel in six weeks.&lt;/p&gt;

&lt;p&gt;This release will not introduce any new features or deprecations. Instead, this
release will be focused around integrating the Glimmer 2 rendering engine into
Ember.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_glimmer-2'&gt;Glimmer 2&lt;/h3&gt;
&lt;p&gt;In this year&amp;#39;s &lt;a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&amp;amp;list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW"&gt;EmberConf keynote&lt;/a&gt;,
Yehuda mentioned that we are working on a highly optimized rendering engine for
Ember called Glimmer 2. A few weeks ago, we announced the &lt;a href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html"&gt;Glimmer 2 alpha&lt;/a&gt;
to invite our community to help test the new engine. Today, we are very excited
to announce that the Glimmer 2 engine will be included in the 2.9 beta release.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_compatibility-first'&gt;Compatibility First&lt;/h4&gt;
&lt;p&gt;As mentioned above, the initial Glimmer 2 integration does not expose any new
user-facing features. The primary goal of this release is maximal compatibility
– &lt;strong&gt;we expect the final release to be a drop-in, completely backwards
compatible upgrade for virtually all Ember users&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During the alpha testing period, the Ember core team and our community were
laser-focused and worked really hard to achieve this goal. Thanks to all the
alpha testers, addon authors and contributors who reported issues or chimed in
with patches, we are able to meet our compatibility target and feel confident
about including Glimmer 2 with the 2.9 release.&lt;/p&gt;

&lt;p&gt;That being said, despite our &lt;a href="https://github.com/emberjs/ember.js/issues/13127"&gt;best efforts&lt;/a&gt;
and the extensive alpha testing, we still might have gotten a few details
wrong, hence the beta releases. We would really appreciate it if you could
start testing your applications and report any regressions, if you have not
already done so. You may refer to the &lt;a href="https://github.com/emberjs/ember.js/issues/13949"&gt;master issue&lt;/a&gt;
for a list of known issues.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s also worth noting that the 2.8-LTS release (when available) will be the
final &lt;a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html"&gt;LTS release&lt;/a&gt;
to include the current-generation rendering engine, which will be supported
with critical bugfixes until at least May 2017 and security patches until at
least October 2017.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_new-template-serialization-format'&gt;New Template Serialization Format&lt;/h4&gt;
&lt;p&gt;Glimmer 2 adopted a new serialization format for the precompiled templates. The
new serialization format offers a few benefits – among them are reduced byte
size (hence download time) and parse time.&lt;/p&gt;

&lt;p&gt;Take this simple template for example:&lt;/p&gt;
&lt;div class="highlight handlebars "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;Hello &lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;{{&lt;/span&gt;&lt;span class="attribute-name"&gt;name&lt;/span&gt;&lt;span class="inline-delimiter"&gt;}}&lt;/span&gt;&lt;/span&gt;! &lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;{{#&lt;/span&gt;&lt;span class="attribute-name"&gt;if&lt;/span&gt; &lt;span class="attribute-name"&gt;isFriday&lt;/span&gt;&lt;span class="inline-delimiter"&gt;}}&lt;/span&gt;&lt;/span&gt;Happy Friday!!!&lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;{{/&lt;/span&gt;&lt;span class="attribute-name"&gt;if&lt;/span&gt;&lt;span class="inline-delimiter"&gt;}}&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In Ember.js 2.8, this template compiles into a JavaScript function with 2273
bytes, or 472 bytes minified and gzipped. At the time of writing, Ember.js 2.9
beta compiles the same template into a JSON string with 374 bytes, or 213 bytes
minified and gzipped. You can explore the difference in &lt;a href="https://gist.github.com/chancancode/6ddef7c343873e5c9c5ea99106cdc238"&gt;this gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are a few caveats with the previous paragraph. First of all, the details
of the templates serialization is a private API that is subject to change
anytime and should not be relied on. Second, the reduction varies between
templates, depending on various factors such as the number of blocks used in
the template. Third, minification and gzip are usually applied to the entire
application bundle and they work a bit differently in those environments.&lt;/p&gt;

&lt;p&gt;Nevertheless, these numbers offer a good ballpark estimates on what you could
expect. From our experience, the reduction generally scales well and holds up
in real-world scenarios.&lt;/p&gt;

&lt;p&gt;Besides the byte size savings, the JSON serialization format also reduces parse
time and allows us to defer the work till the template is actually used.&lt;/p&gt;

&lt;p&gt;This is an area that is still being actively worked on, and we expect the
serialization format to go through some more changes before the Ember.js 2.9
stable release.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_performance'&gt;Performance&lt;/h4&gt;
&lt;p&gt;One of the overarching goals of the Glimmer 2 project is to improve performance
in Ember. While compatibility is the immediate priority for this release,
performance remains an important secondary consideration.&lt;/p&gt;

&lt;p&gt;Our conservative goal for this first release is to avoid introducing any
accidental performance regressions. Based on our testing, we have cleared that
goal with ample headroom.&lt;/p&gt;

&lt;p&gt;As the benefits of Glimmer 2 begin to trickle in, we have already seen
noticeable improvements to rendering performance (both initial render and
re-rendering). Among other things, the &lt;code&gt;{{link-to}}&lt;/code&gt; helper and &lt;code&gt;{{#each}}&lt;/code&gt;
loops with big lists appear to be significantly faster. Component instantiation
has also seen some modest improvement.&lt;/p&gt;

&lt;p&gt;However, we have also noticed a performance regression in the pre-render phase.
Specifically, we have seen a small increase in the &lt;code&gt;vendor.js&lt;/code&gt; byte size and an
increased delay before the application gets to render anything. This regression
eats into the rendering improvements. We are actively working on these issues
and we expect them to be addressed before the final release in Ember 2.9.&lt;/p&gt;

&lt;p&gt;Despite the caveats, our data suggest the savings from template byte size and
improved rendering performance more than offset the current issues. Therefore,
we expect most applications to see an overall improvement in performance upon
upgrading to the beta release.&lt;/p&gt;

&lt;p&gt;It is worth noting that these observations are recorded from complex production
applications maintained by members of the core team (as opposed to isolated
synthetic benchmarks). Given the current state of affairs, we are hesitant to
circulate premature numbers that are specific to a handful of applications. We
plan to perform some thorough analysis as we get closer to the final release.&lt;/p&gt;

&lt;p&gt;In the meantime, we encourage you to test the beta release against your own
applications. If you notice that certain common patterns have become slower,
please report them as bugs. As always – when running performance benchmarks,
&lt;strong&gt;please make sure you are using the minified production build&lt;/strong&gt;
(&lt;code&gt;ember.min.js&lt;/code&gt;). The debug builds contain a lot of helpful development aids
that impact performance negatively.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_future-work'&gt;Future Work&lt;/h4&gt;
&lt;p&gt;While this release serves as an important milestone and proving ground for the
Glimmer 2 project, we are barely scratching the surface here. One of the
informal mandates of the Ember project is &amp;quot;we will keep on shipping&amp;quot;, and this
is no exception.&lt;/p&gt;

&lt;p&gt;The Glimmer 2 engine unlocks a whole new arena of performance optimizations.
Once the dust settles, we are committed to keep iterating on performance
improvements. Ultimately, our goal is to make the overhead of breaking up an
app into small, composable components negligible over time. We are optimistic
that there will still be ample headroom for further improvements in this area.&lt;/p&gt;

&lt;p&gt;Besides performance, Glimmer 2 has laid a solid foundation for us to build on.&lt;/p&gt;

&lt;p&gt;The project originally started when Tom, Yehuda and I spiked on implementing
&amp;quot;angle bracket components&amp;quot; in the HTMLBars (&amp;quot;Glimmer 1&amp;quot;) engine over a year
ago. This exercise highlighted some fundamental misalignments between the
current rendering stack and the direction Ember is headed.&lt;/p&gt;

&lt;p&gt;While HTMLBars handled basic templating, it left the implementation of many of
Ember&amp;#39;s view layer features (notably components) up to Ember itself. Not only
did it make new features more difficult to implement, it made it hard to
implement them &lt;em&gt;efficiently&lt;/em&gt; out of the gate.&lt;/p&gt;

&lt;p&gt;As Ember has moved towards components and &amp;quot;data-down, actions-up&amp;quot;, we wanted to
do many optimizations that just weren&amp;#39;t a good fit for the HTMLBars
architecture. The lessons we learned from the spike ultimately leading us down
the journey that is now known as the Glimmer 2 architecture. The underlying
technologies are very interesting, but I will save those details for another
time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As an Ember user, you can expect the new engine to unlock some long-awaited
features&lt;/strong&gt;, such as FastBoot rehydration, incremental rendering and a refreshed
approach to components once the initial integration is complete.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_thank-you'&gt;Thank You!&lt;/h4&gt;
&lt;p&gt;Since &lt;a href="https://github.com/tildeio/glimmer/compare/rip-htmlbars...master"&gt;forking HTMLBars&lt;/a&gt;,
the Glimmer repo has clocked over 850 commits, not to mention the &lt;a href="https://github.com/emberjs/ember.js/issues?q=label:Glimmer2+is:closed"&gt;integration effort&lt;/a&gt;
that happened on the Ember side and also in the wider ecosystem. All of these
would not be possible without the help from our community.&lt;/p&gt;

&lt;p&gt;Thank you to every one who helped us get here – from the &lt;a href="http://emberjs.com/sponsors/"&gt;companies&lt;/a&gt;
who donated employees&amp;#39; time to the individual contributors who made personal
sacrifices to make this happen.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on the changes landing in Ember.js 2.9 beta, review the &lt;a href="https://github.com/emberjs/ember.js/blob/v2.9.0-beta.1/CHANGELOG.md"&gt;Ember.js 2.9.0-beta.1 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Ember Node.js LTS Support</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/09/07/ember-node-lts-support.html"/>
    <id>http://emberjs.com/blog/2016/09/07/ember-node-lts-support.html</id>
    <published>2016-09-07T00:00:00+00:00</published>
    <updated>2016-09-07T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;Ember is committed to being a good steward of our collective codebases as part of the &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; &lt;a href="https://www.npmjs.com/"&gt;ecosystem&lt;/a&gt;. In that spirit we will be following the &lt;a href="https://github.com/nodejs/LTS#lts-schedule"&gt;Node.js Long Term Support Schedule&lt;/a&gt; to provide clear guarantees of which versions of Node.js we support...&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Ember is committed to being a good steward of our collective codebases as part of the &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; &lt;a href="https://www.npmjs.com/"&gt;ecosystem&lt;/a&gt;. In that spirit we will be following the &lt;a href="https://github.com/nodejs/LTS#lts-schedule"&gt;Node.js Long Term Support Schedule&lt;/a&gt; to provide clear guarantees of which versions of Node.js we support and how long we will support them. We will test against the same set of releases which the Node.js Long-term Support Working Group says they support: any &amp;quot;Current&amp;quot;, &amp;quot;Active LTS&amp;quot;, or &amp;quot;Maintenance&amp;quot; releases.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_what-does-support-mean'&gt;What does support mean?&lt;/h3&gt;
&lt;p&gt;All Ember projects can be expected to work in any of the supported Node.js versions and will support every documented feature. We will not maintain separate branches or classes of support for different Node.js support classifications. For example, Ember CLI can be expected to work just the same running on a &amp;quot;Maintenance&amp;quot; Node.js version as it does on a &amp;quot;Current&amp;quot; Node.js version. Not all of our projects presently align to this pattern but we will, over time, coalesce to this state.&lt;/p&gt;

&lt;p&gt;Meeting this commitment does not come without cost and tough decisions. However, as maintainers of foundational libraries, we believe that it is in our best interest to validate the legitimacy of the Node.js LTS plans, help position Node.js as a reliable and dependable tool for all enterprises, and contribute toward improving the reputation of the ecosystem.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_how-we-drop-support'&gt;How We Drop Support&lt;/h3&gt;
&lt;p&gt;To make it easier for us to deliver on our support promise we have adopted a policy that the &lt;code&gt;HEAD&lt;/code&gt; of our &lt;code&gt;master&lt;/code&gt; branches will be compatible with all versions of Node.js currently receiving support. For any Ember project on the day we drop support for a Node.js version the following things will happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will update the &lt;code&gt;engines&lt;/code&gt; key inside of &lt;code&gt;package.json&lt;/code&gt; to specify the versions supported by the project.&lt;/li&gt;
&lt;li&gt;We will update the testing targets to remove the newly-unsupported Node.js version from the list.&lt;/li&gt;
&lt;li&gt;We will begin accepting code without testing it against the newly-unsupported version of Node.js.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For projects with an unspecified release model we will release one last version of the project prior to those steps. The version number change will reflect &lt;a href="http://semver.org/"&gt;SemVer&lt;/a&gt; with respect to the APIs of the project and not take into consideration removal of Node.js version support. This means that the release may show up as a &amp;quot;patch&amp;quot; version release. For example, if we&amp;#39;re dropping support for Node.js 0.10 and have a project at version 1.3.3 we can drop Node.js 0.10 support when we release version 1.3.4.&lt;/p&gt;

&lt;p&gt;For Ember CLI, which follows a six week release train model, we will continue to patch the currently released version and maintain compatibility. Those patches will not break compatibility with the Node.js versions that Ember CLI supported when it was released. The next six week release of Ember CLI will drop support for the newly-unsupported Node.js version. For example, if we release Ember CLI 2.8.0 on September 6, drop support for Node.js 0.10 on October 1, and discover a bug on October 5 necessitating a 2.8.1 patch release that release will support Node.js 0.10 even though we have officially dropped support. The first version which will not support Node.js 0.10 will be Ember CLI 2.9.0 scheduled to be released on October 17.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_node-js-0-10-node-js-0-12'&gt;Node.js 0.10 &amp;amp; Node.js 0.12&lt;/h3&gt;
&lt;p&gt;Over the next four months Node.js will remove the 0.10 and 0.12 versions from &amp;quot;Maintenance.&amp;quot; We in the Ember community will follow suit. This means that on October 1, 2016 we will drop support for Node.js 0.10 and on January 1, 2017 we will drop support for Node.js 0.12.&lt;/p&gt;

&lt;p&gt;Both of these versions are very long in the tooth and have had a good run but we&amp;#39;re not sad to see them go. We&amp;#39;re looking forward to getting to use &lt;a href="http://kangax.github.io/compat-table/es6/#node012"&gt;language features we&amp;#39;ve had for years in other environments&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_recommended-version'&gt;Recommended Version&lt;/h3&gt;
&lt;p&gt;We recommend that you use the most-recent &amp;quot;Active LTS&amp;quot; version of Node.js. At present that is &lt;a href="https://nodejs.org/en/download/"&gt;Node.js v4.5.0&lt;/a&gt;. This is not to say that you may not use other versions, but by rule the current &amp;quot;Active LTS&amp;quot; will receive the most attention during our testing cycles and be most broadly used within the community.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_future-plans'&gt;Future Plans&lt;/h3&gt;
&lt;p&gt;We recognize that we don&amp;#39;t have the privilege of unilaterally setting this as the default for the entire Node.js ecosystem. It is our hope that with leadership from our community we can encourage more of the Node.js ecosystem to commit to following the schedule laid out by the Node.js LTS Working Group.&lt;/p&gt;

&lt;p&gt;We don&amp;#39;t presently rely upon transpilation to support older versions of the Node.js runtime from a codebase using current JavaScript features. This may change in time but we don&amp;#39;t yet believe the story for tooling and debugging of transpiled JavaScript for Node.js has reached the inflection point where the benefits outweigh the costs.&lt;/p&gt;

&lt;p&gt;Further, if we find ourselves maintaining our own forks or depending upon legacy versions of much of the JavaScript ecosystem, we reserve the option to change our approach in the future. As always we will be paying close attention to the community&amp;#39;s needs and will give at least a six month notice of any change to this stated support policy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://github.com/ErisDS"&gt;Hannah Wolfe&lt;/a&gt; for helping direct us to this approach.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Announcing The Glimmer 2 Alpha</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html"/>
    <id>http://emberjs.com/blog/2016/07/29/announcing-the-glimmer-2-alpha.html</id>
    <published>2016-07-29T00:00:00+00:00</published>
    <updated>2016-07-29T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;In this year's &lt;a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&amp;amp;list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW"&gt;EmberConf keynote&lt;/a&gt;,  Yehuda mentioned that we are working on a highly optimized rendering engine for Ember called Glimmer 2.&lt;/p&gt;

&lt;p&gt;On behalf of all the contributors who have lent a hand along the way, I am very excited to announce that we...&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;In this year&amp;#39;s &lt;a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&amp;amp;list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW"&gt;EmberConf keynote&lt;/a&gt;,  Yehuda mentioned that we are working on a highly optimized rendering engine for Ember called Glimmer 2.&lt;/p&gt;

&lt;p&gt;On behalf of all the contributors who have lent a hand along the way, I am very excited to announce that we have just released Ember 2.9.0-alpha.1, the first official build with Glimmer 2 included.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_a-key-milestone'&gt;🔑 A Key Milestone 🔑&lt;/h2&gt;
&lt;p&gt;During the alpha testing period, we will publish new alpha builds on a weekly cadence, following the &lt;a href="http://emberjs.com/builds/#/beta"&gt;beta releases schedule&lt;/a&gt;. The alpha releases will be cut from the master branch, but with all &lt;a href="https://guides.emberjs.com/v2.7.0/configuring-ember/feature-flags/"&gt;experimental features&lt;/a&gt; other than &lt;code&gt;ember-glimmer&lt;/code&gt; stripped from the builds.&lt;/p&gt;

&lt;p&gt;The purpose of the alpha releases is to enable our community – especially the addon and tooling ecosystem – to start testing the new engine for compatibility and offer feedback. Needless to say, the alpha releases are not intended for production use.&lt;/p&gt;

&lt;p&gt;To test your apps with the alpha builds, simply run &lt;code&gt;bower install --save ember#alpha&lt;/code&gt; and follow the prompt to persist the resolution.&lt;/p&gt;

&lt;p&gt;From Ember&amp;#39;s perspective, integrating Glimmer 2 does not expose any new user-facing features. Even though it is a complete rewrite under the hood, &lt;strong&gt;we expect the final release to be a drop-in, completely backwards compatible upgrade&lt;/strong&gt; for virtually all Ember users. Notably, we will follow our usual &lt;a href="http://semver.org"&gt;SemVer&lt;/a&gt; guarantee and ensure all public APIs continue to function as advertised. At this point, we do not expect to introduce any new deprecations along with the initial release.&lt;/p&gt;

&lt;p&gt;That being said, despite our &lt;a href="https://github.com/emberjs/ember.js/issues/13127"&gt;best efforts&lt;/a&gt;, we might not have gotten every detail right in our very first attempt, hence the alpha releases. We would really appreciate it if you could start testing your applications and report any regressions. You may refer to the &lt;a href="https://github.com/emberjs/ember.js/issues/13949"&gt;master issue&lt;/a&gt; for a list of known issues.&lt;/p&gt;

&lt;p&gt;It is worth noting that the version number (2.9.0-alpha.1) does not imply the new engine will be automatically included in the 2.9 final release. Just like any other changes, the Glimmer 2 integration is subject to the usual rigor and stability requirements of our &lt;a href="http://emberjs.com/blog/2013/09/06/new-ember-release-process.html"&gt;release process&lt;/a&gt;. The core team will make the final decision on when to promote the feature into beta and stable releases based on our learnings from the alpha period.&lt;/p&gt;

&lt;p&gt;Based on current information, the 2.8-LTS release (when available) will likely be the final &lt;a href="http://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html"&gt;LTS release&lt;/a&gt; to include the current-generation rendering engine, which will be supported with critical bugfixes until at least May 2017 and security patches until at least October 2017.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_a-note-on-performance'&gt;🚀 A Note On Performance 🚀&lt;/h2&gt;
&lt;p&gt;While one of the overarching goals of Glimmer 2 is to improve performance, the immediate priority in the alpha phase is maximal compatibility. We are barely scratching the surface with the possible optimizations unlocked by the new engine, and once the dust settles there will be ample headroom for further improvements.&lt;/p&gt;

&lt;p&gt;That being said, you should start seeing some improvements in rendering performance with each alpha release, as well as reduced download/parsing time thanks to the new templates serialization format.&lt;/p&gt;

&lt;p&gt;We are also aware of a few minor bugs that cause performance problems in the first alpha release, which we plan to address quickly. However, it is also possible that we inadvertently regressed performance in certain scenarios. If you noticed certain common patterns have become slower, please report them as bugs.&lt;/p&gt;

&lt;p&gt;As always – when running performance benchmarks, &lt;strong&gt;please make sure you are using the minified production build&lt;/strong&gt; (&lt;code&gt;ember.min.js&lt;/code&gt;). The debug builds contain a lot of helpful development aids that are known to impact performance negatively.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_a-whole-lot-more-to-come'&gt;🎁 A Whole Lot More To Come 🎁&lt;/h2&gt;
&lt;p&gt;Besides performance, Glimmer 2 has laid a solid foundation for us to build on.&lt;/p&gt;

&lt;p&gt;The project originally started when Tom, Yehuda and I spiked on implementing &amp;quot;angle bracket components&amp;quot; in the HTMLBars (&amp;quot;Glimmer 1&amp;quot;) engine over a year ago. This exercise highlighted some fundamental misalignments between the current rendering stack and the direction Ember is headed.&lt;/p&gt;

&lt;p&gt;While HTMLBars handled basic templating, it left the implementation of many of Ember&amp;#39;s view layer features (notably components) up to Ember itself. Not only did it make new features more difficult to implement, it made it hard to implement them &lt;em&gt;efficiently&lt;/em&gt; out of the gate.&lt;/p&gt;

&lt;p&gt;As Ember has moved towards components and &amp;quot;data-down, actions-up&amp;quot;, we wanted to do many optimizations that just weren&amp;#39;t a good fit for the HTMLBars architecture. The lessons we learned from the spike ultimately leading us down the journey that is now known as the Glimmer 2 architecture. The underlying technologies are very interesting, but I will save those details for another time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As an Ember user, you can expect the new engine to unlock some long-awaited features&lt;/strong&gt;, such as FastBoot rehydration and a refreshed approach to components once the initial integration is complete.&lt;/p&gt;
&lt;h2 class='anchorable-toc' id='toc_a-big-thank-you'&gt;❤️ A Big Thank You ❤️&lt;/h2&gt;
&lt;p&gt;Since &lt;a href="https://github.com/tildeio/glimmer/compare/rip-htmlbars...master"&gt;forking HTMLBars&lt;/a&gt;, the Glimmer repo has received over 700 commits, not to mention the &lt;a href="https://github.com/emberjs/ember.js/issues?page=1&amp;amp;q=label%3AGlimmer2+is%3Aclosed"&gt;integration effort&lt;/a&gt; that happened on the Ember side, all of which would not be possible without the help from our community.&lt;/p&gt;

&lt;p&gt;Thank you to every one who helped us get here – from the &lt;a href="http://emberjs.com/sponsors/"&gt;companies&lt;/a&gt; who donated employees&amp;#39; time to the individual contributors who made personal sacrifices to make this happen.&lt;/p&gt;

&lt;p&gt;With all of that out of the way – &lt;em&gt;happy alpha testing&lt;/em&gt;! 🍾🎊🎉&lt;/p&gt;

&lt;hr&gt;
&lt;h2 class='anchorable-toc' id='toc_further-reading-watching'&gt;📚 Further Reading/Watching 📚&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🔜 Stay tuned for more &lt;em&gt;Inside Glimmer 2&lt;/em&gt; articles from this blog&lt;/li&gt;
&lt;li&gt;🚧 &lt;a href="https://github.com/tildeio/glimmer/blob/master/guides/01-introduction.md"&gt;Glimmer Architecture Guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=OInJBwS8VDQ&amp;amp;list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW&amp;amp;index=1"&gt;Opening Keynote&lt;/a&gt; from EmberConf 2016&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dpx9P1cz37k&amp;amp;list=PL4eq2DPpyBblc8aQAd516-jGMdAhEeUiW&amp;amp;index=23"&gt;The Future of Ember Templating&lt;/a&gt; from EmberConf 2016&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vg5A_UOGShg"&gt;Inside Glimmer 2: What Is A Compiler?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vL8sCi1Bv6E"&gt;Glimmer 2 Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ember Data 2.7 and 2.8 Beta Released</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/07/25/ember-data-2-7-released.html"/>
    <id>http://emberjs.com/blog/2016/07/25/ember-data-2-7-released.html</id>
    <published>2016-07-25T00:00:00+00:00</published>
    <updated>2016-07-25T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;Ember Data 2.7, a minor version release of Ember Data, is
released. This release represents the work of over 27 direct
contributors, and over 103 commits.&lt;/p&gt;

&lt;p&gt;Ember Data 2.8 beta.1, the branch of Ember Data that will be released
as stable in roughly six...&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Ember Data 2.7, a minor version release of Ember Data, is
released. This release represents the work of over 27 direct
contributors, and over 103 commits.&lt;/p&gt;

&lt;p&gt;Ember Data 2.8 beta.1, the branch of Ember Data that will be released
as stable in roughly six weeks, is also being released.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_blueprint-changes'&gt;Blueprint Changes&lt;/h3&gt;
&lt;p&gt;In Ember Data 2.5 there was a change made to the blueprints to use
module paths when importing instead of importing the default DS
namespace. At the time this was thought to be a minor change and did
not receive much scrutiny. However, in time the Ember Data team has
discovered that the changes to the import statements in the blueprints
have made it more confusing for both new and experienced Ember
developers.&lt;/p&gt;

&lt;p&gt;In Ember Data 2.5 and Ember Data 2.6 the following generator command for building a model:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ember generate model post content isDraft:boolean comments:has-many user:belongs-to&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It would generate the following blueprint:&lt;/p&gt;
&lt;div class="highlight javascript "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;td colspan="2"&gt;app/models/post.js&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
&lt;strong&gt;10&lt;/strong&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="reserved"&gt;import&lt;/span&gt; Model from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data/model&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;
&lt;span class="reserved"&gt;import&lt;/span&gt; attr from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data/attr&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;
&lt;span class="reserved"&gt;import&lt;/span&gt; { belongsTo, hasMany } from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data/relationships&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; Model.extend({
  &lt;span class="key"&gt;content&lt;/span&gt;: attr(),
  &lt;span class="key"&gt;isDraft&lt;/span&gt;: attr(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;boolean&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;comments&lt;/span&gt;: hasMany(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;comment&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;user&lt;/span&gt;: belongsTo(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;user&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;)
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ember Data 2.7 the same command will now generate the following blueprint:&lt;/p&gt;
&lt;div class="highlight javascript "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;td colspan="2"&gt;app/models/post.js&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="reserved"&gt;import&lt;/span&gt; DS from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; DS.Model.extend({
  &lt;span class="key"&gt;content&lt;/span&gt;: DS.attr(),
  &lt;span class="key"&gt;isDraft&lt;/span&gt;: DS.attr(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;boolean&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;comments&lt;/span&gt;: DS.hasMany(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;comment&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;user&lt;/span&gt;: DS.belongsTo(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;user&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;)
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The main difference is the blueprints no longer use the paths to
import specific modules. We have found that encouraging users to omit
the paths results in better defaults for both new and experienced
Ember developers. The simpler &lt;code&gt;import DS from &amp;#39;ember-data&amp;#39;;&lt;/code&gt; statement
has less room for typos and other errors and is easier to developers
to remember so they do not need reference documentation whenever they
want to add a new import.&lt;/p&gt;

&lt;p&gt;This change &lt;em&gt;only&lt;/em&gt; impacts the blueprints that are generated when
using the
&lt;a href="https://ember-cli.com/user-guide/#using-ember-cli"&gt;ember-cli generate&lt;/a&gt;
command. Code that is written to use the path imports will still
continue to work and be supported until at least Ember Data 3.0.&lt;/p&gt;

&lt;p&gt;The Ember Data team will also be releasing patch releases to Ember
Data 2.5 and 2.6 to update their blueprint generators to match Ember
Data 2.7.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_changes-in-ember-data-2-7'&gt;Changes in Ember Data 2.7&lt;/h3&gt;&lt;h4 class='anchorable-toc' id='toc_code-ds-boolean-transform-allow-null-code-a-href-https-github-com-emberjs-data-pull-4022-4022-a'&gt;&lt;code&gt;ds-boolean-transform-allow-null&lt;/code&gt; &lt;a href="https://github.com/emberjs/data/pull/4022"&gt;#4022&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Allow &lt;code&gt;null&lt;/code&gt;/&lt;code&gt;undefined&lt;/code&gt; values for boolean attributes via &lt;code&gt;attr(&amp;#39;boolean&amp;#39;, { allowNull: true })&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight js "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="comment"&gt;// app/models/user.js&lt;/span&gt;
&lt;span class="reserved"&gt;import&lt;/span&gt; DS from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; DS.Model.extend({
  &lt;span class="key"&gt;email&lt;/span&gt;: DS.attr(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;string&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;username&lt;/span&gt;: DS.attr(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;string&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;wantsWeeklyEmail&lt;/span&gt;: DS.attr(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;boolean&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;, { &lt;span class="key"&gt;allowNull&lt;/span&gt;: &lt;span class="predefined-constant"&gt;true&lt;/span&gt; })
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h4 class='anchorable-toc' id='toc_code-ds-links-in-record-array-code-a-href-https-github-com-emberjs-data-pull-4263-4263-a'&gt;&lt;code&gt;ds-links-in-record-array&lt;/code&gt; &lt;a href="https://github.com/emberjs/data/pull/4263"&gt;#4263&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This feature exposes a &lt;code&gt;links&lt;/code&gt; object on a &lt;code&gt;RecordArray&lt;/code&gt;. This can be used to load additional links when  present in the response JSON-API document.&lt;/p&gt;
&lt;div class="highlight js "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;store.query(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;post&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;, { &lt;span class="key"&gt;isRecent&lt;/span&gt;: &lt;span class="predefined-constant"&gt;true&lt;/span&gt; }).then((posts) =&amp;gt; {
  posts.get(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;links.next&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;);
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/danmcclain"&gt;@danmcclain&lt;/a&gt; for
implementing this feature.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_upcoming-features-in-ember-data-2-8-beta-1'&gt;Upcoming Features in Ember Data 2.8.beta-1&lt;/h3&gt;&lt;h4 class='anchorable-toc' id='toc_code-ds-improved-ajax-code-a-href-https-github-com-emberjs-data-pull-3099-3099-a'&gt;&lt;code&gt;ds-improved-ajax&lt;/code&gt; &lt;a href="https://github.com/emberjs/data/pull/3099"&gt;#3099&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;ds-improved-ajax&lt;/code&gt; feature was originally planned to be released
in Ember Data 2.7. However, feedback from the beta found that many
people are overriding &lt;code&gt;ajax()&lt;/code&gt; to change the protocol of the adapter
and the new methods added in made &lt;code&gt;ds-improved-ajax&lt;/code&gt; made this usecase
harder to achieve. The Ember Data team has decided to delay the
&lt;code&gt;ds-improved-ajax&lt;/code&gt; feature flag until the Ember Data 2.8 release while
improving the API for this usecase.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;ds-improved-ajax&lt;/code&gt; feature adds new public methods to
&lt;code&gt;DS.RESTAdapter&lt;/code&gt;, which allow to customize the properties of a
request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;methodForRequest&lt;/code&gt; to get the HTTP verb&lt;/li&gt;
&lt;li&gt;&lt;code&gt;urlForRequest&lt;/code&gt; to get the URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;headersForRequest&lt;/code&gt; to get the headers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dataForRequest&lt;/code&gt; to get the data (query params or request body)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;params&lt;/code&gt; hash passed to those methods has all the properties with
which the corresponding &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;createRecord&lt;/code&gt;, &lt;code&gt;findQuery&lt;/code&gt;, ...  calls
have been invoked: &lt;code&gt;store&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;snapshot&lt;/code&gt;(s), &lt;code&gt;id&lt;/code&gt;(s) and &lt;code&gt;query&lt;/code&gt;. The
&lt;code&gt;requestType&lt;/code&gt; property indicates which method is requested; the possible
values are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;createRecord&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateRecord&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deleteRecord&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;query&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queryRecord&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findRecord&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findAll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findMany&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findHasMany&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findBelongsTo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performing the actual AJAX request is handled by the &lt;code&gt;makeRequest&lt;/code&gt;
method, which is similar to the existing &lt;code&gt;ajax&lt;/code&gt; method: it makes the
request using &lt;code&gt;jQuery.ajax&lt;/code&gt; and attaches success and failure handlers.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Say your API handles creation of resources via PUT, this can now be
customized as follows:&lt;/p&gt;
&lt;div class="highlight js "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
&lt;strong&gt;10&lt;/strong&gt;
11
12
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="comment"&gt;// adapters/application.js&lt;/span&gt;
&lt;span class="reserved"&gt;import&lt;/span&gt; DS from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember-data&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; DS.RESTAdapter.extend({
  methodForRequest(params) {
    &lt;span class="keyword"&gt;if&lt;/span&gt; (params.requestType === &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;createRecord&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;) {
      &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="string"&gt;&lt;span class="delimiter"&gt;&amp;quot;&lt;/span&gt;&lt;span class="content"&gt;PUT&lt;/span&gt;&lt;span class="delimiter"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;;
    }

    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="local-variable"&gt;this&lt;/span&gt;._super(...&lt;span class="local-variable"&gt;arguments&lt;/span&gt;);
  }
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/pangratz"&gt;@pangratz&lt;/a&gt; for
implementing this feature.&lt;/p&gt;

&lt;p&gt;For more details on changes in the 2.8 beta, please review the
&lt;a href="https://github.com/emberjs/data/blob/v2.8.0-beta.1/CHANGELOG.md"&gt;Ember Data 2.8.0-beta.1 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Ember.js 2.7 and 2.8 Beta Released</title>
    <link rel="alternate" href="http://emberjs.com/blog/2016/07/25/ember-2-7-and-2-8-beta-released.html"/>
    <id>http://emberjs.com/blog/2016/07/25/ember-2-7-and-2-8-beta-released.html</id>
    <published>2016-07-25T00:00:00+00:00</published>
    <updated>2016-07-25T00:00:00+00:00</updated>
    <author>
      <name>Ember</name>
    </author>
    <summary type="html">&lt;p&gt;Ember.js 2.7, a minor version release of Ember with backwards compatible
changes, is released today.&lt;/p&gt;

&lt;p&gt;Ember.js 2.8 beta is also being released today. This branch will be released as
stable in roughly six weeks and will then go on to be the next &lt;a href="/blog/2016/02/25/announcing-embers-first-lts.html"&gt;LTS...&lt;/a&gt;&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Ember.js 2.7, a minor version release of Ember with backwards compatible
changes, is released today.&lt;/p&gt;

&lt;p&gt;Ember.js 2.8 beta is also being released today. This branch will be released as
stable in roughly six weeks and will then go on to be the next &lt;a href="/blog/2016/02/25/announcing-embers-first-lts.html"&gt;LTS release&lt;/a&gt;
roughly six weeks after that.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_changes-in-ember-js-2-7'&gt;Changes in Ember.js 2.7&lt;/h3&gt;
&lt;p&gt;Ember 2.7 introduces one new backward compatible API:&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-ember-computed-uniqby-code'&gt;&lt;code&gt;Ember.computed.uniqBy&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In general, the core team is hesitant about adding any new computed macros
or array prototype extensions to the framework. Instead, we encourage developers
to adopt an addon such as &lt;a href="https://github.com/cibernox/ember-cpm"&gt;ember-cpm&lt;/a&gt;
if they desire an expanded list of macros.&lt;/p&gt;

&lt;p&gt;However contributor &lt;a href="https://github.com/seanjohnson08"&gt;@seanjohnson08&lt;/a&gt; correctly
pointed out there is a logical gap in the APIs Ember provides today. Although
each of &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and &lt;code&gt;reject&lt;/code&gt; have a comparable &lt;code&gt;xxxBy&lt;/code&gt; method
(for example &lt;code&gt;findBy&lt;/code&gt;) no comparable method exists for &lt;code&gt;uniq&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ember 2.7 adds &lt;code&gt;uniqBy&lt;/code&gt; as an computed property macro. For example:&lt;/p&gt;
&lt;div class="highlight js "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
&lt;strong&gt;10&lt;/strong&gt;
11
12
13
14
15
16
17
18
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="reserved"&gt;import&lt;/span&gt; Ember from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; Ember.Component.extend({
  &lt;span class="key"&gt;accidents&lt;/span&gt;: Ember.computed(&lt;span class="keyword"&gt;function&lt;/span&gt;() {
    &lt;span class="keyword"&gt;return&lt;/span&gt; [{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Flipped over&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Saturn&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    },{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Aliens&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Toyota&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    },{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Road rage&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Saturn&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    }];
  }),
  &lt;span class="key"&gt;carsInAccidents&lt;/span&gt;: Ember.computed.mapBy(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;accidents&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;car&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;),
  &lt;span class="key"&gt;uniqueCarsInAccidents&lt;/span&gt;: Ember.computed.uniqBy(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;carsInAccidents&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;id&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;)
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;uniqBy&lt;/code&gt; is also added as an array method. For example:&lt;/p&gt;
&lt;div class="highlight js "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
&lt;strong&gt;10&lt;/strong&gt;
11
12
13
14
15
16
17
18
19
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="reserved"&gt;import&lt;/span&gt; Ember from &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;ember&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;;

&lt;span class="reserved"&gt;export&lt;/span&gt; &lt;span class="keyword"&gt;default&lt;/span&gt; Ember.Component.extend({
  &lt;span class="key"&gt;accidents&lt;/span&gt;: Ember.computed(&lt;span class="keyword"&gt;function&lt;/span&gt;() {
    &lt;span class="keyword"&gt;return&lt;/span&gt; [{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Flipped over&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Saturn&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    },{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Aliens&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;2&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Toyota&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    },{
      &lt;span class="key"&gt;description&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Road rage&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="key"&gt;car&lt;/span&gt;: { &lt;span class="key"&gt;id&lt;/span&gt;: &lt;span class="integer"&gt;1&lt;/span&gt;, &lt;span class="key"&gt;make&lt;/span&gt;: &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;Saturn&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt; }
    }];
  }),
  &lt;span class="key"&gt;uniqueCarsInAccidents&lt;/span&gt;: Ember.computed(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;accidents.@each.car&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="keyword"&gt;function&lt;/span&gt;() {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="local-variable"&gt;this&lt;/span&gt;.get(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;accidents&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;).mapBy(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;car&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;).uniqBy(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;id&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;);
  })
});
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For more information on these methods, see the &lt;a href="http://emberjs.com/api/classes/Ember.computed.html#method_uniqBy"&gt;API docs for the computed
macro&lt;/a&gt;, &lt;a href="http://emberjs.com/api/classes/Ember.Array.html#method_uniqBy"&gt;API
docs for the array
method&lt;/a&gt;, and
&lt;a href="https://github.com/emberjs/ember.js/pull/12875"&gt;PR #12875&lt;/a&gt; introducing these
changes.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_notable-deprecations'&gt;Notable Deprecations&lt;/h4&gt;
&lt;p&gt;The following deprecations are scheduled for release with Ember 2.7:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.Backburner&lt;/code&gt; was private throughout the Ember 2.x series and will be
removed after Ember 2.8, as mentioned in the
&lt;a href="http://emberjs.com/deprecations/v2.x/#toc_ember-backburner"&gt;deprecation guide&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.Binding&lt;/code&gt; has not been needed for some time and is deprecated in favor
of computed properties and services (depending on what you were binding to).
It will be removed in Ember 3.0. See the
&lt;a href="http://emberjs.com/deprecations/v2.x/#toc_ember-binding"&gt;deprecation guide&lt;/a&gt;
for more details.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more details on changes landing in 2.7, review the
&lt;a href="https://github.com/emberjs/ember.js/blob/v2.7.0/CHANGELOG.md"&gt;Ember.js 2.7.0 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class='anchorable-toc' id='toc_ember-js-2-8-beta'&gt;Ember.js 2.8 Beta&lt;/h3&gt;
&lt;p&gt;Ember 2.8 beta introduces the following new backward compatible APIs:&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_engines'&gt;Engines&lt;/h4&gt;
&lt;p&gt;As described in the &lt;a href="https://github.com/emberjs/rfcs/pull/10"&gt;RFC&lt;/a&gt;, &amp;quot;engines
allow multiple logical applications to be composed together into a single
application from the user&amp;#39;s perspective.&amp;quot;&lt;/p&gt;

&lt;p&gt;The best way to use this feature in your apps is through the &lt;a href="http://github.com/dgeb/ember-engines"&gt;ember-engines addon&lt;/a&gt;.
To get started, check out the excellent &lt;a href="https://github.com/dgeb/ember-engines/blob/master/guides/01-introduction.md"&gt;guides&lt;/a&gt;
written by &lt;a href="https://github.com/trentmwillis"&gt;@trentmwillis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release will introduce a set of low-level APIs for the core functionailty
along with the ususal semver guarentee. While the ember-engines addon itself
remains expermental, the introduction of these public APIs means that &lt;strong&gt;ember-engines
is now usable with Ember.js 2.8 beta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Work on engines has proceeded over the past year in both Ember core as well as
the addon. Ember&amp;#39;s architecture has been enhanced to provide the base classes
and hooks needed to support engines. The addon then makes use of these interfaces
to provide a smooth experience building and consuming engines.&lt;/p&gt;

&lt;p&gt;Until now, none of the engine-related classes and hooks in Ember have been
exposed publicly. However, starting with Ember 2.8, the following APIs will be
made public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.Engine&lt;/code&gt; class - The base class for &lt;code&gt;Ember.Application&lt;/code&gt;. Its only public
interface is related to initializers and instance initializers, which is
then inherited by applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Ember.EngineInstance&lt;/code&gt; class - The base class for &lt;code&gt;Ember.ApplicationInstance&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; keyword - Allows for the mounting of routeless engines in templates.
This keyword currently only takes one argument, the name of the engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; router DSL - Allows routable engines to be mounted at a location in
a route map.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By making these APIs public, ember-engines and other addons will be able to
access them without a feature-flag in a (soon-to-be) stable release of Ember. By
accessing only public interfaces in Ember, an addon won&amp;#39;t need to rely on
private overrides and can provide as stable an experience as possible.&lt;/p&gt;

&lt;p&gt;We predict that engines will grow in popularity once work on lazy loading is
complete. By delaying the loading of engines until they&amp;#39;re accessed, we can
decrease the initial payload size and startup time for applications. If you&amp;#39;re
interested in helping to implement or test lazy loading of engines, please check
out the thorough &lt;a href="https://github.com/dgeb/ember-engines/issues/154"&gt;attack plan&lt;/a&gt;
written up by &lt;a href="https://github.com/nathanhammond"&gt;@nathanhammond&lt;/a&gt;.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-enumerable-includes-code-and-code-array-includes-code'&gt;&lt;code&gt;Enumerable#includes&lt;/code&gt; and &lt;code&gt;Array#includes&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In an effort to remain inline with ES standards, the methods
&lt;code&gt;Enumerable#contains&lt;/code&gt; and &lt;code&gt;Array#contains&lt;/code&gt; have been deprecated in favor of the
new methods &lt;code&gt;Enumerable#includes&lt;/code&gt; and &lt;code&gt;Array#includes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://github.com/alexspeller"&gt;@alexspeller&lt;/a&gt; for the &lt;a href="https://github.com/emberjs/rfcs/blob/master/text/0136-contains-to-includes.md"&gt;RFC&lt;/a&gt;
that proposed this change.&lt;/p&gt;

&lt;p&gt;Thanks as well to &lt;a href="https://github.com/bmeurant"&gt;@bmeurant&lt;/a&gt; for the
&lt;a href="https://github.com/emberjs/ember.js/pull/13553"&gt;PR&lt;/a&gt; that implemented the change.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-ember-string-ishtmlsafe-code'&gt;&lt;code&gt;Ember.String.isHTMLSafe&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new method &lt;code&gt;Ember.String.isHTMLSafe&lt;/code&gt; detects if a string was decorated using
&lt;code&gt;Ember.String.htmlSafe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight javascript "&gt;&lt;div class="ribbon"&gt;&lt;/div&gt;&lt;div class="scroller"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line-numbers"&gt;&lt;pre&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; plainString = &lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;plain string&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;,
    safeString = Ember.String.htmlSafe(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;span class="content"&gt;&amp;lt;div&amp;gt;someValue&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="delimiter"&gt;'&lt;/span&gt;&lt;/span&gt;);

Ember.String.isHTMLSafe(plainString); &lt;span class="comment"&gt;// false&lt;/span&gt;
Ember.String.isHTMLSafe(safeString);  &lt;span class="comment"&gt;// true&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a href="https://github.com/workmanw"&gt;@workmanw&lt;/a&gt; for the
&lt;a href="https://github.com/emberjs/rfcs/pull/139"&gt;RFC&lt;/a&gt; that proposed this new API, as
well as the &lt;a href="https://github.com/emberjs/ember.js/pull/13666"&gt;PR&lt;/a&gt; that
implemented it.&lt;/p&gt;

&lt;p&gt;On a related note, please create safe strings with &lt;code&gt;Ember.String.htmlSafe&lt;/code&gt;
instead of the deprecated &lt;code&gt;Ember.Handlebars.SafeString&lt;/code&gt;. See the &lt;a href="http://emberjs.com/deprecations/v2.x/#toc_use-ember-string-htmlsafe-over-ember-handlebars-safestring"&gt;deprecation
guide&lt;/a&gt;
for details.&lt;/p&gt;
&lt;h4 class='anchorable-toc' id='toc_code-ember-test-checkwaiters-code'&gt;&lt;code&gt;Ember.Test.checkWaiters&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The new method &lt;code&gt;Ember.Test.checkWaiters&lt;/code&gt; provides a simple mechanism for test
tooling to determine whether all async test waiters have settled. This replaces
the intimate API &lt;code&gt;Ember.Test.waiters&lt;/code&gt;, which has been deprecated and will be
removed in Ember 2.8 final.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://github.com/rwjblue"&gt;@rwjblue&lt;/a&gt; and
&lt;a href="https://github.com/krisselden"&gt;@krisselden&lt;/a&gt; for implementing this method.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;For more details on changes landing in 2.8 beta, review the
&lt;a href="https://github.com/emberjs/ember.js/blob/v2.8.0-beta.1/CHANGELOG.md"&gt;Ember.js 2.8.0-beta.1 CHANGELOG&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
</feed>
