Ангулар ничего не знает о клике, повешенном через метод .on() — поэтому после клика Ангулару нужно принудительно сообщить об рефреше скоупа:
a.on('click', function(e) {
var page = e.target.text;
$scope.setPage(page);
// обновляем скоуп
$scope.$apply();
});
По поводу вообще всего в общем:
В контроллере должна быть только логика — забудьте про жиКвери, забудьте про селекторы, выкиньте из головы жиКвери-подход — контроллеры ничего не знают о DOM-элементах, в контроллерах только логика.
Прятать/показывать элементы нужно не по-жикверевски, через метод
.css() (работая с DOM), а по-ангуларовски, через
ng-show (работя с логикой).
Задавать классы нужно не по-жикверевски, через метод
.addClass() (работая с DOM), а по-ангуларовски, через
ng-class (работя с логикой) (причем, ты задаешь классы
.show/.hide — тут не классы нужны, тут используй
ng-show, ведь ты же
показываешь/прячешь).
Вставлять элементы в DOM не нужно, это делается прямо в ХТМЛе, а не в контроллере:
<ul class="pagination">
<li ng-repeat="page in pages">{{page}}</li>
</ul>
Вешать события на элементы нужно не по-жикверевски, а прямо в ХТМЛе:
<ul class="pagination">
<li ng-repeat="page in pages" ng-click="openPage(page)">{{page}}</li>
</ul>
Да и вообще, там должна быть обычная ссылка, а не событие клика:
<ul class="pagination">
<li ng-repeat="page in pages">
<a ng-href="/page/{{page}}">{{page}}</a>
</li>
</ul>
И самое главное — удалите жиКвери. Он не нужен вообще-привообще, выкиньте из мозга саму концепцию жиКвери, выкиньте способ размышления на жиКвери — Ангулар работает совершенно по-другому.