I will try to improve upon Andzej Maciusovic
's hoping to obtain a canonical answer. Indeed VueJS has a feature called computed property that can be quickly shown using an example:
<template>
<div>
<p>A = <input type="number" v-model="a"/></p>
<p>B = <input type="number" v-model="b"/></p>
<p>C = <input type="number" v-model="c"/></p>
<p>Computed property result: {{ product }}</p>
<p>Function result: {{ productFunc() }}</p>
</div>
</template>
<script>
export default {
data () {
return {
a: 2,
b: 3,
c: 4
}
},
computed: {
product: function() {
console.log("Product called!");
return this.a * this.b;
}
},
methods: {
productFunc: function() {
console.log("ProductFunc called!");
return this.a * this.b;
}
}
}
</script>
Whenever the user changes input value for a
or b
, both product
and productFunc
are logging to console. If user changes c
, only productFunc
is called.
Coming back to Angular, mobxjs really helps with this issue:
- Install it using
npm install --save mobx-angular mobx
- Use
observable
and computed
attributes for bound properties
TS file
import { observable, computed } from 'mobx-angular';
@Component({
selector: 'home',
templateUrl: './home.component.html',
animations: [slideInDownAnimation]
})
export class HomeComponent extends GenericAnimationContainer {
@observable a: number = 2;
@observable b: number = 3;
@observable c: number = 4;
getAB = () => {
console.log("getAB called");
return this.a * this.b;
}
@computed get AB() {
console.log("AB called");
return this.a * this.b;
}
}
Markup
<div *mobxAutorun>
<p>A = <input type="number" [(ngModel)]="a" /> </p>
<p>B = <input type="number" [(ngModel)]="b" /> </p>
<p>C = <input type="number" [(ngModel)]="c" /> </p>
<p> A * B = {{ getAB() }}</p>
<p> A * B (get) = {{ AB }}</p>
</div>
If a
or b
is changed, AB
is called once and getAB
several times. If c
is changed, only getAB
is called. So, this solution is more efficient even when computation must be performed.
get name() { return ... }
. – Estus Flasksubscribe
or bound to view directly with| async
pipe. As you can see, there are no computed properties at all, data flow is performed via observables. If you have a particular case in mind, feel free to ask a question. – Estus Flask