avoiding common pitfalls in ember.js

42
Avoiding Common Pitfalls The mistakes everyone makes with Ember.js @ alexspeller

Upload: alex-speller

Post on 22-Apr-2015

9.209 views

Category:

Software


7 download

DESCRIPTION

The mistakes everyone makes, collated from many hours helping people on IRC and the forums

TRANSCRIPT

Page 1: Avoiding Common Pitfalls in Ember.js

Avoiding Common PitfallsThe mistakes everyone makes with Ember.js

@alexspeller

Page 2: Avoiding Common Pitfalls in Ember.js

Routing• Resource vs Route

• < 1.7 - routes cannot have sub routes

• >= 1.7 - only difference is namespace inheritance

• Guideline: route == verb, resource == noun

Page 3: Avoiding Common Pitfalls in Ember.js

Routing• Validation vs Setup phase

• First all beforeModel / model / afterModel hooks are called

• Then all activate / setupController / renderTemplate hooks are called

• Calling transition.abort() or this.transitionTo() in the validation phase cancels the transition without affecting controller state

Page 4: Avoiding Common Pitfalls in Ember.js

Routing• Route nesting === Template Nesting

• If you want a non-nested template, give the path option

Page 5: Avoiding Common Pitfalls in Ember.js

Routing• Automatic index route is generated when using

resources

Page 6: Avoiding Common Pitfalls in Ember.js

Routing• Index is not just for collections

Page 7: Avoiding Common Pitfalls in Ember.js

Routing• The model hook will not be always be called

Page 8: Avoiding Common Pitfalls in Ember.js

Routing

• You can transition without providing all params

Page 9: Avoiding Common Pitfalls in Ember.js

Routing!

• Routes and controllers are not necessarily 1:1

Page 10: Avoiding Common Pitfalls in Ember.js

Routing

• serialize is called for link-to

Page 11: Avoiding Common Pitfalls in Ember.js

Routing• Hackathon result

• http://alexspeller.com/ember-diagonal/

Page 12: Avoiding Common Pitfalls in Ember.js

Actions• Actions bubble to all active routes

Page 13: Avoiding Common Pitfalls in Ember.js

Templates

• Precompilation

Page 14: Avoiding Common Pitfalls in Ember.js

Templates

• {{bind-attr}} special behaviour for class

Page 15: Avoiding Common Pitfalls in Ember.js

Templates

• classNameBindings on helpers e.g. {{link-to}}

Page 16: Avoiding Common Pitfalls in Ember.js

Templates• Difference between {{render}}, {{partial}} and

{{view}}

• http://emberjs.com/guides/templates/rendering-with-helpers/

• Render cannot take arguments - is not contextual

• Render does not have anything to do with the route of the same name, does not need an associated route

Page 17: Avoiding Common Pitfalls in Ember.js

Templates

• {{#each}} helper has a lot of subtle different uses

• http://ember.guru/2014/hidden-features-of-the-each-aka-loopedy-loop-helper

Page 18: Avoiding Common Pitfalls in Ember.js

Components

• Components are intentionally isolated

• You should pass in all the state you need

• Communicating between components is hard

• http://madhatted.com/2013/8/31/emberfest-presentation-complex-architectures-in-ember

Page 19: Avoiding Common Pitfalls in Ember.js

Components - sendAction• Actions must be passed in the template as strings

Page 20: Avoiding Common Pitfalls in Ember.js

Computed Properties• Forgetting the property helper

Page 21: Avoiding Common Pitfalls in Ember.js

Array dependent keys - [], @each

Page 22: Avoiding Common Pitfalls in Ember.js

Computed Properties• Overwriting Computed properties

Page 23: Avoiding Common Pitfalls in Ember.js

Computed Properties• Wrong dependencies

Page 24: Avoiding Common Pitfalls in Ember.js

Observers

• Not called for unconsumed computed properties

• Synchronous

• http://emberjs.com/guides/object-model/observers/ is (now) good at explaining all the issues

Page 25: Avoiding Common Pitfalls in Ember.js

Promises

• Errors getting swallowed

Page 26: Avoiding Common Pitfalls in Ember.js

Promises• Aggregating Promises Em.RSVP.all etc

Page 27: Avoiding Common Pitfalls in Ember.js

Promises!

• Stefan Penner talk:

• https://www.youtube.com/watch?v=eHomHs3PrP8

Page 28: Avoiding Common Pitfalls in Ember.js

The Run Loop• Not using Em.run when dealing with 3rd Party Callbacks

Page 29: Avoiding Common Pitfalls in Ember.js

Ember Data• Non-live relations https://github.com/emberjs/

data/issues/1308

store.filter is a workaround for this

Page 30: Avoiding Common Pitfalls in Ember.js

Ember Data• Invalid JSON

• “” is not valid JSON:

• Silently fails :(

Page 31: Avoiding Common Pitfalls in Ember.js

Ember Data

• find() vs find({})

• find(‘posts’) returns a live array of all records in a store, even new records

• find(‘posts’, {}) will perform the same query but the result is not live

Page 32: Avoiding Common Pitfalls in Ember.js

Ember Data• in-memory caching issues • store.find(‘post’, 1) will cache after first request • post.reload() now possible • If it may not be loaded it can be quite ugly:

Page 33: Avoiding Common Pitfalls in Ember.js

Debugging• Use the debugger! (and {{debugger}})

• Use console.log! (and {{log}})

• Use the Ember Inspector!

• LOG_TRANSITIONS and LOG_TRANSITIONS_INTERNAL

• http://eviltrout.com/2014/08/16/debugging-ember-js.html

Page 34: Avoiding Common Pitfalls in Ember.js

Architecture

Page 35: Avoiding Common Pitfalls in Ember.js

JavaScript• Some things aren’t real objects, e.g. strings

• Can be confusing sometimes

Page 36: Avoiding Common Pitfalls in Ember.js

JavaScript Mistakes• “Ember Object Self Troll”

• http://reefpoints.dockyard.com/2014/04/17/ember-object-self-troll.html

Page 37: Avoiding Common Pitfalls in Ember.js

JavaScript Mistakes• Function scope and “this”

Page 38: Avoiding Common Pitfalls in Ember.js

JavaScript Mistakes• Native array methods e.g. push

Page 39: Avoiding Common Pitfalls in Ember.js

Coffeescript• Action bubbling

Page 40: Avoiding Common Pitfalls in Ember.js

Coffeescript• Em.computed makes for nicer properties

https://gist.github.com/alexspeller/8317125

Page 41: Avoiding Common Pitfalls in Ember.js

Mistakes asking for help• Asking the wrong question - asking too broadly

• Not giving a reproducible example

• Not using a jsbin / jsfiddle

• Noone will show you how to do it “wrong”

• Not saying “I don’t understand”

Page 42: Avoiding Common Pitfalls in Ember.js

Thank You!

@alexspeller

emberkit.com