Suppose your element with show.bind is bounded to a property name isVisible:
import { observable } from 'aurelia-framework';
class ABC {
// populated by Aurelia ref binding
readonly element: HTMLElement;
// this is the cache for element size before it gets display: none
elementRectSnapshot: ClientRect;
@observable()
isVisible: boolean;
isVisibleChanged(newValue: boolean) {
// element reference will only be available after bind lifecycle
// so we do nothing when element is not available
if (!this.element) {
return;
}
// If new value is falsy,
// the element it's bound with will be hidden
if (!newValue) {
this.elementRectSnapShot = this.element.getBoundingClientRect();
}
}
}
Why it works: changeHandler of @observable is called synchronously, thus will be executed before bindings. Which means isVisibleChanged will be executed before the element gets hidden, so the size should be valid. For more on difference between @observable and @bindable, you can have a look at Difference between @observable and @bindable