Ответ 1
Я сделал некоторую отладку.
Во-первых, для меня счастливое число остается в поле ввода не случайно.
enter 3 (model==3, input==3)
= > enter 7 (alert, model==null, input="")
= > enter 3 (model==3, input==3)
= > remove 3 (model=="", input=="")
= > enter 7 (alert, model==null, input="")
= > enter 7 (alert, model==null, input="7")
7 остается в поле ввода только в том случае, если предыдущее значение модели было нулевым.
Что происходит: когда вы вводите входное событие 7, которое обрабатывается функция прослушивателя . Функция прослушивателя вызывает $setViewValue. $setViewValue устанавливает $viewValue, $modelValue, значение модели и вызывает $viewChangeListeners (ngChangeDirective просто добавляет обработчик в $viewChangeListeners). Отобразится предупреждение, значение luckynumber равно null. В конце концов, если luckynumber отличается от предыдущего значения предыдущей грязной проверкой $watch handler и $render.
В моих примерах $render вызывается, если предыдущее значение модели было "3" или "". Если предыдущее значение модели было равно null, рендер не вызывается.
Почему $timeout с задержкой 0 работает: когда вы вызываете $timeout с функцией задержки 0 с изменением количества удачных вызовов на null, переносится в конце очереди событий (все javascript в браузере выполняется в одном потоке). $viewChangeListener не изменяет значение модели от 7 до нуля. $digest заканчивается. Затем вызывается $timeout handler. Значение модели равно null. $watch handler и $render. $render присваивает входному значению значение "".