Tengo un formulario que usa marcado de Bootstrap, como el siguiente:
<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>
Hay una gran cantidad de código repetitivo allí, que me gustaría reducir a una nueva directiva: formulario de entrada, como sigue:
<form-input label="Name" form-id="nameInput"></form-input>
genera:
<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>
Tengo tanto trabajo a través de una plantilla simple.
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>'
}
})
Sin embargo, es cuando llego a agregar una funcionalidad más avanzada que me atasco.
¿Cómo puedo admitir valores predeterminados en la plantilla?
Me gustaría exponer el parámetro "tipo" como un atributo opcional en mi directiva, por ejemplo:
<form-input label="Password" form-id="password" type="password"/></form-input>
<form-input label="Email address" form-id="emailAddress" type="email" /></form-input>
Sin embargo, si no se especifica nada, me gustaría usar de forma predeterminada "text". ¿Cómo puedo apoyar esto?
¿Cómo puedo personalizar la plantilla en función de la presencia / ausencia de atributos?
También me gustaría poder admitir el atributo "obligatorio", si está presente. P.ej:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
Si requiredestá presente en la directiva, me gustaría agregarlo al generado <input />en la salida e ignorarlo de lo contrario. No estoy seguro de cómo lograrlo.
Sospecho que estos requisitos pueden haberse movido más allá de una simple plantilla y tienen que comenzar a usar las fases de precompilación, pero no tengo por dónde empezar.
typese establece dinámicamente a través de un enlace, por ejemplo?type="{{ $ctrl.myForm.myField.type}}"? Revisé todos los métodos a continuación y no pude encontrar ninguna solución que funcione en este escenario. Parece que la función de plantilla verá valores literales de los atributos, por ejemplo.tAttr['type'] == '{{ $ctrl.myForm.myField.type }}'en lugar detAttr['type'] == 'password'. Estoy confundido.