Slide 1

Slide 1 text

Getting ready for ember 2.0 Ivan Vanderbyl @ivanderbyl

Slide 2

Slide 2 text

A brief history of ember ➔ First Melbourne Ember meetup was May, 2013, just weeks before Ember 1.0 shipped ➔ Ember 1.0 took 2 years to ship. Ember 2.0 isn't far off 2 years since 1.0 ➔ We now have scheduled releases of Ember every 6 weeks. ➔ Coordinated versioning of all Core supported libraries ➔ Ember Data 1.13 finally shipped, after 3 years of work

Slide 3

Slide 3 text

August 7th, ish. ember 2.0

Slide 4

Slide 4 text

Overview 1. New features in Ember 2.0 2. Removed in 2.0 3. Upgrade path

Slide 5

Slide 5 text

/* what’s new in 2.0 */

Slide 6

Slide 6 text

Ember 2.0 has undefined new features.

Slide 7

Slide 7 text

Ember 2.0 has NaN new features.

Slide 8

Slide 8 text

Ember 2.0 has null new features.

Slide 9

Slide 9 text

Ember 2.0 has 0 new features.

Slide 10

Slide 10 text

Ember 2.0 has -1 new features.

Slide 11

Slide 11 text

Ember 2.0 has no new features.

Slide 12

Slide 12 text

ember 2.0 is 1.13 in disguise

Slide 13

Slide 13 text

"Ember 2.0 is just removing deprecated code, and having a lighter, more modern Ember." — Eric Bryn

Slide 14

Slide 14 text

/* What's new 1.13 (for real) */

Slide 15

Slide 15 text

First Ember release to ship with Glimmer rendering engine 3rd generation rendering engine after HTMLBars, and Handlebars.

Slide 16

Slide 16 text

/* Data flow is unidirectional */ Data Down, Actions Up (DDAU) moving away from two-way bindings

Slide 17

Slide 17 text

Components now have: didInitAttrs runs after a component was created and passed attrs are guaranteed to be present. didReceiveAttrs runs after didInitAttrs, and it also runs on subsequent re-renders. didUpdateAttrs runs when the attributes of a component have changed. http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_component-lifecycle-hooks Component Lifecycle Hooks

Slide 18

Slide 18 text

Note that a component is re-rendered whenever: - any of its attributes change - component.set() is called - component.rerender() is called - a property on a model or service used by the template has changed (including through computed properties).

Slide 19

Slide 19 text

/* New Helper API */

Slide 20

Slide 20 text

- Represent a single value - Do not manage DOM or control flow - Can recompute themselves, similar to how a component can rerender - Can optionally access services - Do not require a dash in the name Ember helpers:

Slide 21

Slide 21 text

// app/helpers/full-name.js import Ember from "ember"; export default Ember.Helper.helper(function (params, hash) { return params.join(' '); });

Slide 22

Slide 22 text

// Inside curly braces {{full-name "Daniel" model.lastName}} // As a sub-expression {{my-component name=(full-name model.firstName "Smith")}}

Slide 23

Slide 23 text

// app/helpers/full-name.js import Ember from "ember"; export default Ember.Helper.extend({ // This service name is only an example nameBuilder: Ember.service.inject(), compute(params, hash) { return this.get('nameBuilder').build(params, hash.title); }, rebuildName: Ember.observer('nameBuilder.isAnonymized', function() { this.recompute(); }) });

Slide 24

Slide 24 text

/* Closure Actions */

Slide 25

Slide 25 text

// app/controllers/index.js import Ember from "ember"; export default Ember.Controller.extend({ actions: { setName(name) { model.set('name', name); } } }); {{! app/templates/index.hbs }} {{my-component submit=(action 'setName')}}

Slide 26

Slide 26 text

// app/components/my-component.js import Ember from "ember"; export default Ember.Component.extend({ click() { this.attrs.submit(this.get('name')); } });

Slide 27

Slide 27 text

- Can be passed multiple arguments - Return a value. For example var result = this.attrs.submit(); - Can curry. For example submit=(action 'setName' “Tom”) would pass "Tom" as the first argument to setName when submit is called. Actions:

Slide 28

Slide 28 text

Deprecate ALL THE THINGS

Slide 29

Slide 29 text

/* How do deprecations work? */

Slide 30

Slide 30 text

somePublicAPI()

Slide 31

Slide 31 text

// Deprecated by core team, will be removed in 2.0 Ember.deprecate(“This API will be removed in 2.0, please do otherThing(arg) instead”, this.isUsingSomePublicAPI, { id: “some_public_api”, until: “2.0” }); somePublicAPI()

Slide 32

Slide 32 text

Release version 1.13 Deprecates: - somePublicAPI(), removed in 2.0 - ... http://emberjs.com/deprecations

Slide 33

Slide 33 text

1. Update “ember” in bower.json to “1.13” 2. bower install 3. Fix use of somePublicAPI in your app

Slide 34

Slide 34 text

Release version 2.0 Removes: - somePublicAPI() - someOtherAPI() - ... Release version 1.13 Deprecates: - somePublicAPI(), removed in 2.0 - ... http://emberjs.com/deprecations

Slide 35

Slide 35 text

1. Update “ember” in bower.json to “2.0” 2. bower install

Slide 36

Slide 36 text

Your app still works

Slide 37

Slide 37 text

Ember Chrome Extension

Slide 38

Slide 38 text

/* What’s actually being removed in 2.0? */

Slide 39

Slide 39 text

Notable Deprecations: ➔ Ember.CoreView, Ember.View, Ember.ContainerView and Ember. CollectionView ➔ Ember._Metamorph, Ember._MetamorphView ➔ The {{view "some-view"}} helper ➔ The {{view}} keyword ➔ {{each itemView=, {{each itemViewClass=, {{each tagName=, {{each emptyView=, {{each emptyViewClass ➔ Ember.Select and {{view "select"}} ➔ Ember.Checkbox is not removed, but will become a component instead of a view ➔ Ember.reduceComputed and Ember.arrayComputed in favor of plain normal array manipulations. ➔ Non-block param {{with ➔ Ember.ObjectController, Ember.ArrayController, The {{controller}} keyword, needs: on controllers The most commonly used parts of the view API will be supported into the foreseeable future via a core-supported add-on. http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_notable-deprecations-in-1-13

Slide 40

Slide 40 text

/* APIs that didn’t make the cut */ Routable Components Angle Bracket Components … Probably coming in 2.1, maybe, not sure.

Slide 41

Slide 41 text

/* Upgrading to Ember 2.0 */

Slide 42

Slide 42 text

1. Fix all 1.13 deprecation messages 2. Update “ember” in bower.json to “2.0” 3. bower install 4. Done.

Slide 43

Slide 43 text

/* Q/A */

Slide 44

Slide 44 text

Upgrade path for {{view “select”}}

Slide 45

Slide 45 text

{{! app/templates/components/my-select.hbs}} {{#each content key="@index" as |item|}} {{item}} {{/each}}