Во первых используй более новую версию angular <script src="http://code.angularjs.org/1.2.0rc1/angular.min.js"></script>
Я по прежнему не понимаю в чём прикол. В твоём коде нет смысла.
Ситуация абсурдна. Ты используешь контролёр ngModel и можешь реагировать на изменения значения ng-model в рендере. Но блять почему-то тебе этого мало и ты отслеживаешь изменения ещё и при помощи watch. Ну да по фиг. Но млять дальше веселее. Ты вмешиваешься в работу ngModelCtrl из события при чём в фазе $apply (когда ngModelCtrl ещё не полностью инициализирован) тем самым меняя нормальную работу ngModelCtrl и получая неожиданные лулзы в рендере.
Получается что ты используешь два взаимоисключающий механизма чтобы при помощи первого(watch) пытаться изменить работу второго(ngModelCtrl)
Теперь детали.
Если говорить о твоём примере то в фазе apply viewValue и modelValue имеет тип число а не object как в фазe digest. Если предположить что viewValue станет объектом при первом срабатывании render(а точнее при первом watch в ngModelCtrl) то твоё событие срабатывает до рендер и в событии ты пытаешся присвоить значение свойству числа.
Демонстрация здесь ->http://plnkr.co/edit/WE1oxyNniYgCz5eLUOQu?p=preview
// вот что у тебя происходит
// как видишь ошибки нет (проверял в хроме), но и свойство не присвоишь.
var a=NaN;
a.modelView="100500";
alert(a);
alert("значение a.modelView= " + a.modelView);
ещё одна ошибка в том что ngModel.$viewValue у тебя ОБЬЕКТ, так как model который передаёшь это объект. А ты объект пытаешься отобразить как строку или число.
ngModel.$render = function() {
//нужно писать
element.html(ngModel.$viewValue.value || '');
//не нужно писать
//element.html(ngModel.$viewValue || '');
};
Ты хрен пойми чё делаешь, и как следствие у тебя хрен пойми что получается