Наверняка вы не раз использовали метод $on() у $scope или $rootScope. Да, этот тот самый метод для добавления обработчика событий. Но, как вы можете видеть, метода $off() не существует. Однако удалить обработчик события иногда бывает необходимо и, конечно, это возможно.
Жестко обнулить массив в $$listeners, например так:
$scope.$on('someEvent', function() { ... }); // Обработчик добавлен
$scope.$$listeners.someEvent = []; // Обработчик удален
Это не совсем официальный способ, но он проверен и отлично работает. Однако, не удобно будет удалять какой-то конкретный обработчик с целью оставить остальные (если их много). На этот случай есть другой, малоизвестный (и малологичный способ):
var stopFunction = $scope.$on('someEvent', function() { ... }); // Обработчик добавлен
stopFunction(); // Обработчик удален
Дело в том, что метод $on() возвращает функцию для удаления обработчика. Об этом мало кто знает, но это довольно полезная фича. Кстати, метод $watch() работает точно так же.
Если вы пробовали привязывать значение в hidden поле, то заметили, что это не работает. Это связано с тем, что ngModel подразумевает двустороннюю привязку, но в hidden поле не может быть таковой. Это ограничение обходится довольно просто:
<input type="hidden" value="{{ value }}" />
Начиная с версии 1.3 AngularJS имеет метод $watchGroup() у $scope. Он позволяет "следить" сразу за несколькими переменными в одном обработчике
$scope.foo = 'foo';
$scope.bar = 'bar';
$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
// newValues[0] -> $scope.foo
// newValues[1] -> $scope.bar
});
Думаю, вам интересно будет почитать сравнение AngularJS и React.