Getting a HandleBars

on Template Metaprogramming

Fun Handlebars Tricks

(OR)

By Jeffrey Biles

Customize how to show name

Data pulled from server

//models/person.js
import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({
  firstName: attr('string'),
  lastName: attr('string'),
  title: attr('string'),

  fullName: Ember.computed('firstName', 'lastName', function(){
    return `${this.get('firstName')} ${this.get('lastName')}`;
  })
});
//routes/handlebars-fun.js
import Ember from 'ember';

export default Ember.Route.extend({
  model(){
    return this.store.findAll('person');
  }
});
{{!- templates/handlebars-fun.hbs }}
{{#each model as |person|}}
  Say hello to {{person.firstName}}
{{/each}}
{{!- templates/handlebars-fun.hbs }}
{{#each model as |person|}}
  Say hello to {{person.fullName}}
{{/each}}

User Choice

Part 1: Selection

import Ember from 'ember';

export default Ember.Controller.extend({
  nameTypes: ['firstName', 'lastName', 'fullName'],
  nameType: 'fullName'
});
{{#x-select value=nameType}}
  {{#each nameTypes as |type|}}
    {{#x-option value=type}}{{type}}{{/x-option}}
  {{/each}}
{{/x-select}}

Part 2a: A Model Property?

import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import Ember from 'ember';
// import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  firstName: attr('string'),
  lastName: attr('string'),
  title: attr('string'),
  fullName: Ember.computed('firstName', 'lastName', function(){
    return `${this.get('firstName')} ${this.get('lastName')}`;
  }),
  funHandlebarsController: Ember.inject.controller(),
  computedName: Ember.computed('funHandlebarsController.nameType', function(){
    return this.get(this.get('funHandlebarsController.nameType'));
  })
});

NOPE

{{#each model as |person|}}
  Say hello to {{person.computedName}}.
{{/each}}

Part 2b: computedNames?

import Ember from 'ember';

export default Ember.Controller.extend({
  nameTypes: ['firstName', 'lastName', 'fullName'],
  nameType: 'fullName',
  computedNames: Ember.computed('nameType', 'model.[]', function(){
    return this.get('model').map((person)=>{
      return person.get(this.get('nameType'));
    });
  })
});
{{#each computedNames as |name|}}
  Say hello to {{name}}.
{{/each}}

Gross

Part 2c: A Component?

import Ember from 'ember';

export default Ember.Controller.extend({
  computedName: Ember.computed('nameType', 'person', function(){
    return this.get(`person.${this.get('nameType')}`);
  })
});

¯\_(ツ)_/¯

{{#each model as |person|}}
  {{say-hello person=person nameType=nameType}}.
{{/each}}
Say hello to {{computedName}}.

More Handlebars

Part 2d: Handlebars

{{#each model as |person|}}
  Say hello to {{get person nameType}}.
{{/each}}
{{#each model as |person|}}
  Say hello to {{get person nameType}}.
{{/each}}

vs

import Ember from 'ember';

export default Ember.Controller.extend({
  nameTypes: ['firstName', 'lastName', 'fullName'],
  nameType: 'fullName',
  computedNames: Ember.computed('nameType', 'model.[]', function(){
    return this.get('model').map((person)=>{
      return person.get(this.get('nameType'));
    });
  })
});
{{#each computedNames as |name|}}
  Say hello to {{name}}.
{{/each}}
  • get
  • concat
  • hash
  • mut
  • with

Cool Handlebars Helper

s

56!!

ember-composable-helpers

Use More Handlebars

Thank you

@jeffreybiles

www.emberscreencasts.com

@emberscreencast

Fun Handlebars Tricks

By Jeffrey Biles

Fun Handlebars Tricks

  • 1,631