Upgrade to Pro — share decks privately, control downloads, hide ads and more …

15 Things You Shouldn't Do In Ember Anymore

15 Things You Shouldn't Do In Ember Anymore

Kerrick Long

August 03, 2015
Tweet

More Decks by Kerrick Long

Other Decks in Programming

Transcript

  1. 15 Things
    You shouldn’t be doing
    in Ember.js anymore

    View Slide

  2. Kerrick Long
    Things I make and do Where to find me online
    twitter.com/KerrickLong
    github.com/Kerrick
    Lead Front-end Developer
    at Second Street
    KerrickLong.com
    www.
    meetup.com/ STLEmber

    View Slide

  3. Not using
    Ember CLI

    View Slide

  4. npm install -g ember-cli
    ember new my-project

    View Slide

  5. Using needs in
    Controllers

    View Slide

  6. import Ember from 'ember';


    export default Ember.Controller.extend({

    needs: ['pages'],

    title: 'controllers.pages.model.title'

    });

    Using needs in Controllers

    View Slide

  7. import Ember from 'ember';


    export default Ember.Controller.extend({

    pages: Ember.inject.controller(),

    title: 'pages.model.title'

    });
    Using inject in Controllers

    View Slide

  8. import Ember from 'ember';


    export default Ember.Controller.extend({

    foo: Ember.inject.controller('pages'),

    title: 'foo.model.title'

    });

    Using inject in Controllers

    View Slide

  9. Computed
    properties with
    getter / setter in
    one function

    View Slide

  10. import Ember from 'ember';


    export default Em.Service.extend({

    minutes: 480,

    hours: Em.computed('minutes', function(k, v) {

    if (arguments.length > 1) {

    this.set('minutes', v * 60);

    }


    return this.get('minutes') / 60;

    })

    });
    Computed getter / setter

    View Slide

  11. Computed getter / setter
    import Ember from 'ember';


    export default Em.Service.extend({

    minutes: 480,

    hours: Em.computed('minutes', {

    get() {

    return this.get('minutes') / 60;

    },

    set(k, v) {

    return this.set('minutes', v * 60);

    }

    })

    });

    View Slide

  12. Using
    this.resource
    in the router

    View Slide

  13. Using this.resource
    Router.map(function() {

    this.resource('pages', function() {

    this.resource('comments');

    });

    });
    // app/routes/comments/index.js

    export default Ember.Route.extend({

    model() {

    return this.store.find('comments');

    }

    });

    View Slide

  14. Using this.resource
    Router.map(function() {

    this.route('pages', function() {

    this.route('comments');

    });

    });

    // app/routes/pages/comments/index.js

    export default Ember.Route.extend({

    model() {

    return this.store.find('comments');

    }

    });

    View Slide

  15. Using {{bind-
    attr}}

    View Slide

  16. Using {{bind-attr}}

    Submit!


    View Slide

  17. Using {{bind-attr}}

    Submit!


    View Slide

  18. {{#each}} without as

    View Slide

  19. {{#each}} with in

    {{#each messages}}

    {{text}}

    {{/each}}


    View Slide

  20. {{#each}} with in

    {{#each message in messages}}

    {{message.text}}

    {{/each}}



    View Slide

  21. {{#each}} with in

    {{#each messages as |message|}}

    {{message.text}}

    {{/each}}


    View Slide

  22. Using the
    {{render}}
    helper

    View Slide

  23. The {{render}} helper

    {{render "my-controller" model}}


    View Slide

  24. The {{render}} helper

    {{my-component thing=model}}


    View Slide

  25. Using the
    {{view}} helper

    View Slide

  26. ember g component new-way

    View Slide

  27. Using
    Ember.Select

    View Slide

  28. Using {{view "select"}}
    {{view "select"

    content=model.pages

    optionValuePath="content.id"

    optionLabelPath="content.title"

    prompt="-- Select One --"

    }}

    View Slide

  29. Using {{view "select"}}
    “Make your own.”
    http://emberjs.com/deprecations/v1.x/#toc_ember-select

    View Slide

  30. Using {{view "select"}}
    “Make your own.”
    http://emberjs.com/deprecations/v1.x/#toc_ember-select
    Or use a legacy addon.

    View Slide

  31. Creating
    arrayComputed
    properties

    View Slide

  32. Using arrayComputed
    import Ember from 'ember';


    export default Ember.Controller.extend({

    uniqueChildren: Ember.arrayComputed('[email protected].[]', {

    addedItem: function(accumulatedValue, model) {

    accumulatedValue.addObjects(model.get('children'));

    return accumulatedValue.uniq();

    },

    removedItem: function(accumulatedValue, model) {

    accumulatedValue.removeObjects(model.get('children'));

    return accumulatedValue.uniq();

    }

    })

    });

    View Slide

  33. Using arrayComputed
    import Ember from 'ember';


    export default Ember.Controller.extend({

    uniqueChildren: Ember.computed('[email protected].[]', function() {

    return _.flatten(this.get('model').map(x => x.get('children'))).uniq();

    })

    });

    View Slide

  34. Creating
    reduceComputed
    properties

    View Slide

  35. Using reduceComputed
    import Ember from 'ember';


    export default Ember.Controller.extend({

    total: Ember.reduceComputed('[email protected]', {

    initialValue: 0,

    addedItem(accumulatedValue, item) {

    return accumulatedValue + item.get('value');

    },

    removedItem(accumulatedValue, item) {

    return accumulatedValue - item.get('value');

    }

    })

    });

    View Slide

  36. Using reduceComputed
    import Ember from 'ember';


    export default Ember.Controller.extend({

    total: Ember.computed('[email protected]', function() {

    const addValues = (p, x) => p + x.get('value');

    return this.get('model').reduce(addValues, 0);

    })

    });

    View Slide

  37. Using
    ObjectController

    View Slide

  38. Using ObjectController
    import Ember from 'ember';


    export default Ember.ObjectController.extend({

    foo: Ember.computed.not('bar')

    });

    View Slide

  39. Using ObjectController
    import Ember from 'ember';


    export default Ember.Controller.extend({

    foo: Ember.computed.not('model.bar')

    });

    View Slide

  40. Using
    ArrayController

    View Slide

  41. Using ArrayController
    import Ember from 'ember';


    export default Ember.ArrayController.extend({

    sortProperties: ['date', 'name']

    // You can use `arrangedContent`

    });

    View Slide

  42. Using ArrayController
    import Ember from 'ember';


    export default Ember.Controller.extend({

    arrangedContent: Ember.computed.sort(/**/)

    });

    View Slide

  43. Using
    {{#each}} with
    itemController

    View Slide

  44. ember g component new-way

    View Slide

  45. Mutating data in
    components

    View Slide

  46. Parent
    Child
    data
    manipulation
    manipulation
    source of data

    View Slide

  47. Parent
    Child
    data
    manipulation
    source of data

    View Slide

  48. Parent
    Child
    data
    manipulation
    actions regarding user input or intent
    source of data

    View Slide

  49. Thank you.

    View Slide