Customizing a Component's Element
By default, each component is backed by a <div>
element. If you were
to look at a rendered component in your developer tools, you would see
a DOM representation that looked something like:
<div id="ember180" class="ember-view">
<h1>My Component</h1>
</div>
You can customize what type of element Ember generates for your
component, including its attributes and class names, by creating a
subclass of Component
in your JavaScript.
Customizing the Element
To use a tag other than div
, subclass Component
and assign it
a tagName
property. This property can be any valid HTML5 tag name as a
string.
import Component from '@ember/component';
export default Component.extend({
tagName: 'nav'
});
<ul>
<li><LinkTo @route="home">Home</LinkTo></li>
<li><LinkTo @route="about">About</LinkTo></li>
</ul>
Customizing the Element's Class
You can specify the class of a component's element at invocation time the same way you would for a regular HTML element:
<NavigationBar class="primary" />
You can also specify which class names are applied to the component's
element by setting its classNames
property to an array of strings:
import Component from '@ember/component';
export default Component.extend({
classNames: ['primary']
});
If you want class names to be determined by properties of the component, you can use class name bindings. If you bind to a Boolean property, the class name will be added or removed depending on the value:
import Component from '@ember/component';
export default Component.extend({
classNameBindings: ['isUrgent'],
isUrgent: true
});
This component would render the following:
<div class="ember-view is-urgent"></div>
If isUrgent
is changed to false
, then the is-urgent
class name will be removed.
By default, the name of the Boolean property is dasherized. You can customize the class name applied by delimiting it with a colon:
import Component from '@ember/component';
export default Component.extend({
classNameBindings: ['isUrgent:urgent'],
isUrgent: true
});
This would render this HTML:
<div class="ember-view urgent">
Besides the custom class name for the value being true
, you can also specify a class name which is used when the value is false
:
import Component from '@ember/component';
export default Component.extend({
classNameBindings: ['isEnabled:enabled:disabled'],
isEnabled: false
});
This would render this HTML:
<div class="ember-view disabled">
You can also specify a class which should only be added when the property is
false
by declaring classNameBindings
like this:
import Component from '@ember/component';
export default Component.extend({
classNameBindings: ['isEnabled::disabled'],
isEnabled: false
});
This would render this HTML:
<div class="ember-view disabled">
If the isEnabled
property is set to true
, no class name is added:
<div class="ember-view">
If the bound property's value is a string, that value will be added as a class name without modification:
import Component from '@ember/component';
export default Component.extend({
classNameBindings: ['priority'],
priority: 'highestPriority'
});
This would render this HTML:
<div class="ember-view highestPriority">
Customizing Attributes
You can bind attributes to the DOM element that represents a component
by using attributeBindings
:
import Component from '@ember/component';
export default Component.extend({
tagName: 'a',
attributeBindings: ['href'],
href: 'http://emberjs.com'
});
You can also bind these attributes to differently named properties:
import Component from '@ember/component';
export default Component.extend({
tagName: 'a',
attributeBindings: ['customHref:href'],
customHref: 'http://emberjs.com'
});
If the attribute is null, it won't be rendered:
import Component from '@ember/component';
export default Component.extend({
tagName: 'span',
attributeBindings: ['title'],
title: null,
});
This would render this HTML when no title is passed to the component:
<span class="ember-view">
...and this HTML when a title of "Ember JS" is passed to the component:
<span class="ember-view" title="Ember JS">