Первый способ больше нравится, т.к. пользователю очевиднее задавать модель в ng-model. Проблема в том, что добавляется еще один ngModelController, который участвует в валидации. Поэтому, на родительском диве также формируются классы ng-pristine и т.п., и сообщение об ошибке валидации может дублироваться.
Решил проблему установкой
terminal: true,
priority: 200
Но не до конца понимаю механизм приоритетов. Правильно ли сделал. Кто-нибудь может объяснить?
.directive('formPassword', function() {
return {
restrict: 'AE',
terminal: true,
priority: 200,
templateUrl: 'template.html',
replace: true,
scope: {
model: '=ngModel'
},
compile: function(tElem, tAttrs) {
var input = tElem.find('input')[0];
for (var k in tAttrs.$attr) {
if (tAttrs.$attr.hasOwnProperty(k)) {
if (k !== 'formPassword' && k !== 'type') {
input.setAttribute(tAttrs.$attr[k], tAttrs[k]);
}
if (k !== 'ngModel' && k !== 'class') {
tElem.removeAttr(tAttrs.$attr[k]);
delete tAttrs.$attr[k];
delete tAttrs[k];
}
}
}
return function(scope, element, attrs, ctrls) {
scope.show = false;
}
}
};
});