I need some help regarding changing/manipulating some HTML markup that is generated by data binding.
Suppose I have a view that renders a list of search results. Something like this:
app.ts
export interface Contact {
id: number;
firstName: string;
lastName: string;
email?: string;
phoneNumber?: string;
}
export class App {
contacts: Contact[] = [
{ id: 1, firstName: "John", lastName: "Tolkien", email: "tolkien@inklings.com", phoneNumber: "867-5309" },
{ id: 2, firstName: "Clive", lastName: "Lewis", email: "lewis@inklings.com", phoneNumber: "867-5309" },
{ id: 3, firstName: "Owen", lastName: "Barfield", email: "barfield@inklings.com", phoneNumber: "867-5309" },
{ id: 4, firstName: "Charles", lastName: "Williams", email: "williams@inklings.com", phoneNumber: "867-5309" },
{ id: 5, firstName: "Roger", lastName: "Green", email: "green@inklings.com", phoneNumber: "867-5309" }
];
}
app.html
<template>
<require from="./highlight-value-converter"></require>
<require from="./highlight-custom-attribute"></require>
<style>
.item {
position: relative;
margin: .25rem;
padding: .25em;
border: 1px solid;
border-radius: .25em;
}
.item-name {
font-size: larger;
font-weight: bolder;
}
.item-info-label {
display: inline-block;
width: 10em;
}
.item-info-text {
font-weight: bolder;
}
</style>
<div repeat.for="contact of contacts" class="item">
<div class="item-name">${contact.firstName} ${contact.lastName}</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">${contact.email}</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">${contact.phoneNumber}</span>
</div>
</div>
</template>
The final generated HTML will probably look somewhat like this:
<style>
.item {
position: relative;
margin: .25rem;
padding: .25em;
border: 1px solid;
border-radius: .25em;
}
.item-name {
font-size: larger;
font-weight: bolder;
}
.item-info-label {
display: inline-block;
width: 10em;
}
.item-info-text {
font-weight: bolder;
}
</style>
<div class="item">
<div class="item-name">John Tolkien</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">tolkien@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Clive Lewis</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">lewis@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Owen Barfield</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">barfield@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Charles Williams</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">williams@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Roger Green</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">green@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
Now suppose this list was the result for searching/filtering for the letter âeâ⊠I would like to additionally highlight this in the search results by replacing e
with <mark>e</mark>
. The expected generated HTML should look something like this:
<style>
.item {
position: relative;
margin: .25rem;
padding: .25em;
border: 1px solid;
border-radius: .25em;
}
.item-name {
font-size: larger;
font-weight: bolder;
}
.item-info-label {
display: inline-block;
width: 10em;
}
.item-info-text {
font-weight: bolder;
}
</style>
<div class="item">
<div class="item-name">John Tolki<mark>e</mark>n</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">tolki<mark>e</mark>n@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Cliv<mark>e</mark> L<mark>e</mark>wis</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">l<mark>e</mark>wis@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Ow<mark>e</mark>n Barfi<mark>e</mark>ld</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">barfi<mark>e</mark>ld@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Charl<mark>e</mark>s Williams</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">williams@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
<div class="item">
<div class="item-name">Rog<mark>e</mark>r Gr<mark>e</mark><mark>e</mark>n</div>
<div>
<span class="item-info-label">E-mail:</span>
<span class="item-info-text">gr<mark>e</mark><mark>e</mark>n@inklings.com</span>
</div>
<div>
<span class="item-info-label">Phone number:</span>
<span class="item-info-text">867-5309</span>
</div>
</div>
I have tried a value converter, but it does not change the markup; the replacements get HTML encoded afterwards, so instead of a highlighted âeâ, it will literally show <mark>e</mark>
.
I have also tried a custom attribute, but I do not get it to work. And if I would get it to work, I am not sure how I would have to tackle data binding refreshes due to changes in the viewmodelâs collection.
Is there a way to accomplish this kind of additional HTML rendering behavior in a relatively easy way? Are there any known general techniques or best practices to manipulate (or hook into) the data binding HTML rendering/generation behavior of Aurelia?