Ich habe ein Formular, das Markup von Bootstrap verwendet, wie das folgende:
<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>
Es gibt eine Menge Boilerplate-Code, den ich auf eine neue Direktive reduzieren möchte - Formulareingabe wie folgt:
<form-input label="Name" form-id="nameInput"></form-input>
erzeugt:
<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>
Ich habe so viel Arbeit über eine einfache Vorlage.
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>'
}
})
Wenn ich jedoch erweiterte Funktionen hinzufüge, stecke ich fest.
Wie kann ich Standardwerte in der Vorlage unterstützen?
Ich möchte den Parameter "type" als optionales Attribut in meiner Direktive verfügbar machen, z.
<form-input label="Password" form-id="password" type="password"/></form-input>
<form-input label="Email address" form-id="emailAddress" type="email" /></form-input>
Wenn jedoch nichts angegeben ist, möchte ich standardmäßig auf "text"
. Wie kann ich das unterstützen?
Wie kann ich die Vorlage basierend auf dem Vorhandensein / Fehlen von Attributen anpassen?
Ich möchte auch das Attribut "erforderlich" unterstützen können, wenn es vorhanden ist. Z.B:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
Wenn required
es in der Direktive vorhanden ist, möchte ich es dem <input />
in der Ausgabe generierten hinzufügen und es ansonsten ignorieren. Ich bin mir nicht sicher, wie ich das erreichen soll.
Ich vermute, dass diese Anforderungen über eine einfache Vorlage hinausgegangen sind und die Vorkompilierungsphasen verwenden müssen, aber ich weiß nicht, wo ich anfangen soll.
type
dynamisch über Bindung gesetzt wird, z.type="{{ $ctrl.myForm.myField.type}}"
? Ich habe alle folgenden Methoden überprüft und konnte keine Lösung finden, die in diesem Szenario funktioniert. Es sieht so aus, als würde die Vorlagenfunktion Literalwerte der Attribute sehen, z.tAttr['type'] == '{{ $ctrl.myForm.myField.type }}'
statttAttr['type'] == 'password'
. Ich bin verwirrt.