This is a simplified example.
Let’s say we have a name input component that has input boxes for the firstName
and lastName
. But we don’t care about these separate variables, only the combined fullName
. We want to be able to get that value from the custom component.
<name-input full-name.from-view="customerName">
Intuitively, you use a computedFrom getter for this:
@customElement("name-input")
class NameInput{
private firstName: string;
private lastName: string;
@computedFrom("firstName", "lastName")
public get fullName() { return this.firstName + " " + this.lastName; }
}
This is not yet bindable to the outside, so we add a bindable, that only allows data to flow from the component to the outside, not the other way:
class NameInput{
private firstName: string;
private lastName: string;
@bindable({defaultBindingMode: "fromView"})
@computedFrom("firstName", "lastName")
public get fullName() { return this.firstName + " " + this.lastName; }
}
This does not work…
Also not having only bindable there, or only computedFrom. A getter cannot be bound in Aurelia it seems.
Current solution
Turn it into a normal variable.
To mimic the computedFrom
we need to turn firstName and lastName into observables and recalculate fullName manually.
class NameInput{
@observable
private firstName: string;
@observable
private lastName: string;
@bindable({defaultBindingMode: "fromView"})
public fullName: string;
private setfullName(): void
{
this.fullName = this.firstName + " " + this.lastName;
}
private firstNameChanged(): void
{
setFullName();
}
private lastNamechanged(): void
{
setFullName();
}
}
This solution is far from ideal, having 3 functions and a variable, when 1 getter would do. If the computedFrom has more variables, this will grow large very quickly.
Are there any better solutions?