Tenho um formulário que usa marcação do Bootstrap, como o seguinte:
<form class="form-horizontal">
<fieldset>
<legend>Legend text</legend>
<div class="control-group">
<label class="control-label" for="nameInput">Name</label>
<div class="controls">
<input type="text" class="input-xlarge" id="nameInput">
<p class="help-block">Supporting help text</p>
</div>
</div>
</fieldset>
</form>
Há muito código clichê lá, que eu gostaria de reduzir a uma nova diretiva - form-input, como a seguir:
<form-input label="Name" form-id="nameInput"></form-input>
gera:
<div class="control-group">
<label class="control-label" for="nameInput">Name</label>
<div class="controls">
<input type="text" class="input-xlarge" id="nameInput">
</div>
</div>
Tenho tudo isso trabalhando por meio de um modelo simples.
angular.module('formComponents', [])
.directive('formInput', function() {
return {
restrict: 'E',
scope: {
label: 'bind',
formId: 'bind'
},
template: '<div class="control-group">' +
'<label class="control-label" for="{{formId}}">{{label}}</label>' +
'<div class="controls">' +
'<input type="text" class="input-xlarge" id="{{formId}}" name="{{formId}}">' +
'</div>' +
'</div>'
}
})
No entanto, é quando eu venho para adicionar funcionalidades mais avançadas que estou ficando preso.
Como posso oferecer suporte a valores padrão no modelo?
Gostaria de expor o parâmetro "type" como um atributo opcional na minha diretiva, por exemplo:
<form-input label="Password" form-id="password" type="password"/></form-input>
<form-input label="Email address" form-id="emailAddress" type="email" /></form-input>
No entanto, se nada for especificado, gostaria de usar como padrão "text". Como posso apoiar isso?
Como posso personalizar o modelo com base na presença / ausência de atributos?
Eu também gostaria de ser capaz de oferecer suporte ao atributo "required", se estiver presente. Por exemplo:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
Se requiredestiver presente na diretiva, gostaria de adicioná-lo ao gerado <input />na saída e ignorá-lo caso contrário. Não tenho certeza de como fazer isso.
Suspeito que esses requisitos podem ter ido além de um simples modelo e precisam começar a usar as fases de pré-compilação, mas não sei por onde começar.
typefor definido dinamicamente por meio de ligação, por exemplo.type="{{ $ctrl.myForm.myField.type}}"? Verifiquei todos os métodos abaixo e não encontrei nenhuma solução que funcione neste cenário. Parece que a função de modelo verá valores literais dos atributos, por exemplo.tAttr['type'] == '{{ $ctrl.myForm.myField.type }}'em vez detAttr['type'] == 'password'. Estou confuso.