use `once` to avoid removing self in listener.