Напишите директиву. Это единственный правильный путь.
Псевдокод:
function editOnceDirective(){
return {
require: 'ngModel',
link: function (scope, el, attr, ctrl) {
// включаем редактирование если у нас пустое значение
// еще стоит проверять убрали ли мы фокус с поля и все такое
scope.$watch(function () { return ctrl.$invalid; }, function (isInvalid) {
if (!isBoolean(isInvalid)) return;
el.attr('contenteditable', isInvalid);
}
// вешаем листенеры на элемент что бы обновлять значение
}
}
}
Читать про ngModelController, кастомные инпуты и т.д.