とりあえず、以下を実行したら反映された。
$scope.$apply();
次のイベントが呼ばれるまで反映されないときがある。
AngularJSでは、dirty-checkingという方式で実装されいるそうです。
バインドしているすべての変数について、特定のタイミングで前回の値と今回の値を比較し、値に変化があればDOMを書き換えるという仕組みです。
データが変更されてるかチェックするデフォルトは以下のタイミングらしい
イベント | 概要 |
ナビゲーション | ブラウザの location 変更時 |
ネットワーク | $http, $resource レスポンス受信時 |
DOM イベント | ng-click, ng-mouseover などの実行時 |
タイマー | $timeout によるタイマー処理の実行時 |
参考URL