Ember.js 2.7, a minor version release of Ember with backwards compatible
changes, is released today.
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 LTS release
roughly six weeks after that.
Changes in Ember.js 2.7
Ember 2.7 introduces one new backward compatible API:
Ember.computed.uniqBy
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 ember-cpm
if they desire an expanded list of macros.
However contributor @seanjohnson08 correctly
pointed out there is a logical gap in the APIs Ember provides today. Although
each of find
, map
, filter
, and reject
have a comparable xxxBy
method
(for example findBy
) no comparable method exists for uniq
.
Ember 2.7 adds uniqBy
as an computed property macro. For example:
import Ember from 'ember';
export default Ember.Component.extend({
accidents: Ember.computed(function() {
return [{
description: 'Flipped over',
car: { id: 1, make: 'Saturn' }
},{
description: 'Aliens',
car: { id: 2, make: 'Toyota' }
},{
description: 'Road rage',
car: { id: 1, make: 'Saturn' }
}];
}),
carsInAccidents: Ember.computed.mapBy('accidents', 'car'),
uniqueCarsInAccidents: Ember.computed.uniqBy('carsInAccidents', 'id')
});
uniqBy
is also added as an array method. For example:
import Ember from 'ember';
export default Ember.Component.extend({
accidents: Ember.computed(function() {
return [{
description: 'Flipped over',
car: { id: 1, make: 'Saturn' }
},{
description: 'Aliens',
car: { id: 2, make: 'Toyota' }
},{
description: 'Road rage',
car: { id: 1, make: 'Saturn' }
}];
}),
uniqueCarsInAccidents: Ember.computed('accidents.@each.car', function() {
return this.get('accidents').mapBy('car').uniqBy('id');
})
});
For more information on these methods, see the API docs for the computed
macro, API
docs for the array
method, and
PR #12875 introducing these
changes.
Notable Deprecations
The following deprecations are scheduled for release with Ember 2.7:
Ember.Backburner
was private throughout the Ember 2.x series and will be
removed after Ember 2.8, as mentioned in the
deprecation guide.Ember.Binding
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
deprecation guide
for more details.
For more details on changes landing in 2.7, review the
Ember.js 2.7.0 CHANGELOG.
Ember.js 2.8 Beta
Ember 2.8 beta introduces the following new backward compatible APIs:
Engines
As described in the RFC, "engines
allow multiple logical applications to be composed together into a single
application from the user's perspective."
The best way to use this feature in your apps is through the ember-engines addon.
To get started, check out the excellent guides
written by @trentmwillis.
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 experimental, the introduction of these public APIs means that ember-engines
is now usable with Ember.js 2.8 beta.
Work on engines has proceeded over the past year in both Ember core as well as
the addon. Ember'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.
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:
Ember.Engine
class - The base class forEmber.Application
. Its only public
interface is related to initializers and instance initializers, which is
then inherited by applications.Ember.EngineInstance
class - The base class forEmber.ApplicationInstance
.mount
keyword - Allows for the mounting of routeless engines in templates.
This keyword currently only takes one argument, the name of the engine.mount
router DSL - Allows routable engines to be mounted at a location in
a route map.
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't need to rely on
private overrides and can provide as stable an experience as possible.
We predict that engines will grow in popularity once work on lazy loading is
complete. By delaying the loading of engines until they're accessed, we can
decrease the initial payload size and startup time for applications. If you're
interested in helping to implement or test lazy loading of engines, please check
out the thorough attack plan
written up by @nathanhammond.
Enumerable#includes
and Array#includes
In an effort to remain inline with ES standards, the methods
Enumerable#contains
and Array#contains
have been deprecated in favor of the
new methods Enumerable#includes
and Array#includes
.
Thanks to @alexspeller for the RFC
that proposed this change.
Thanks as well to @bmeurant for the
PR that implemented the change.
Ember.String.isHTMLSafe
The new method Ember.String.isHTMLSafe
detects if a string was decorated using
Ember.String.htmlSafe
.
For example:
var plainString = 'plain string',
safeString = Ember.String.htmlSafe('someValue');
Ember.String.isHTMLSafe(plainString); // false
Ember.String.isHTMLSafe(safeString); // true
Thanks to @workmanw for the
RFC that proposed this new API, as
well as the PR that
implemented it.
On a related note, please create safe strings with Ember.String.htmlSafe
instead of the deprecated Ember.Handlebars.SafeString
. See the deprecation
guide
for details.
Ember.Test.checkWaiters
The new method Ember.Test.checkWaiters
provides a simple mechanism for test
tooling to determine whether all async test waiters have settled. This replaces
the intimate API Ember.Test.waiters
, which has been deprecated and will be
removed in Ember 2.8 final.
Thanks to @rwjblue and
@krisselden for implementing this method.
For more details on changes landing in 2.8 beta, review the
Ember.js 2.8.0-beta.1 CHANGELOG.