Saya memiliki formulir yang menggunakan markup dari Bootstrap, seperti berikut:
<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>
Ada banyak kode boilerplate di sana, yang ingin saya kurangi menjadi direktif baru - form-input, seperti berikut:
<form-input label="Name" form-id="nameInput"></form-input>
menghasilkan:
<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>
Saya memiliki banyak pekerjaan melalui template sederhana.
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>'
}
})
Namun, ketika saya menambahkan fungsionalitas yang lebih canggih, saya terjebak.
Bagaimana saya bisa mendukung nilai default di template?
Saya ingin mengekspos parameter "type" sebagai atribut opsional pada direktif saya, misalnya:
<form-input label="Password" form-id="password" type="password"/></form-input>
<form-input label="Email address" form-id="emailAddress" type="email" /></form-input>
Namun, jika tidak ada yang ditentukan, saya ingin menggunakan default "text"
. Bagaimana saya bisa mendukung ini?
Bagaimana cara menyesuaikan template berdasarkan ada / tidak adanya atribut?
Saya juga ingin dapat mendukung atribut "diperlukan", jika ada. Misalnya:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
Jika required
ada dalam direktif, saya ingin menambahkannya ke yang dihasilkan <input />
dalam output, dan mengabaikannya sebaliknya. Saya tidak yakin bagaimana mencapai ini.
Saya menduga persyaratan ini mungkin telah melampaui template sederhana, dan harus mulai menggunakan fase pra-kompilasi, tetapi saya bingung harus mulai dari mana.
type
diatur secara dinamis melalui pengikatan misalnya.type="{{ $ctrl.myForm.myField.type}}"
? Saya memeriksa semua metode di bawah ini dan tidak dapat menemukan solusi apa pun yang akan berfungsi dalam skenario ini. Sepertinya fungsi template akan melihat nilai literal dari atribut mis.tAttr['type'] == '{{ $ctrl.myForm.myField.type }}'
bukannyatAttr['type'] == 'password'
. Aku bingung.