don't invoke change callback if already destroyed