The goal is to define a structure of HTML that has more than one block of content that is declared by the caller. For example, a header, body, and content. The resulting markup should be:
<header>My header</header>
<div class="body">My body</div>
<footer>My footer</footer>
The template instantiating the component would define each of the three sections, My header
, My body
, and My footer
.
With Ruby on Rails, you would use content_for :header
to capture the header content from the caller, and yield :header
to interpolate it.
Is this possible in ember.js?
The content of the tag is also referred to as the block. The {{yield}} syntax yields to the block once the block is passed into the component. You can think of the Message component like a function, and the block as a callback that you're passing to the component.
Ember uses the Handlebars templating library to power your app's user interface. Handlebars templates contain static HTML and dynamic content inside Handlebars expressions, which are invoked with double curly braces: {{}} . Dynamic content inside a Handlebars expression is rendered with data-binding.
Ember components are used to turn markup text and styles into reusable content. Components consist of two parts: a JavaScript component file that defines behavior, and its accompanying Handlebars template that defines the markup for the component's UI. Components must have at least one dash in their name.
This addon provides an API for authoring element modifiers in Ember. It mirrors Ember's helper API, with variations for writing both simple function-based modifiers and more complicated class-based modifiers.
As of ember v1.10, yield accepts parameters. However handlebars doesn't yet allow for inline comparisons of variable values. By defining some properties on the component, we can get pretty close to what rails does.
Per the above example, the component's template would look like:
<header>{{yield header}}</header>
<div class="body">{{yield body}}</div>
<footer>{{yield footer}}</footer>
And the component definition would resolve the variable arguments to the yield statements:
export default Ember.Component.extend({
header: {isHeader: true},
footer: {isFooter: true},
body: {isBody: true}
});
This means that {{yield header}}
is actually yielding an object {isHeader: true}
to the consuming template. So we can use a nested if/else structure to declare the three sections like this:
{{#my-comp as |section|}}
{{#if section.isHeader}}
My header
{{else if section.isBody}}
My body
{{else if section.isFooter}}
My footer
{{/if}}
{{/my-comp}}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With