O evento ao alterar é incrível, mas quando você tem muitas coisas a fazer quando esse evento acontece (por exemplo, quando o usuário escreve algo em uma entrada) a GUI irá congelar como o inferno!
Eu escrevo uma diretiva para fazer esse trabalho de forma assíncrona:
https://github.com/institut-de-genomique/Ultimate-DataTable/blob/master/src/directives/udt-change.js
Eu uso a função $ interval angularjs (setInterval com $ apply no final) para controlar um tique. A cada tick, verifico se preciso executar a função.
Para executar a função no contexto certo, uso um observador que desabilito logo após sua execução.
O objetivo que tento alcançar é usar promessa para que a função não execute simultaneamente, mas por enquanto esta solução funciona bem.