次のように、Bootstrapのマークアップを使用しているフォームがあります。
<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>
そこにはたくさんの定型コードがあり、次のような新しいディレクティブ(form-input)に還元したいと思います。
<form-input label="Name" form-id="nameInput"></form-input>
生成:
<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>
私は単純なテンプレートを介してこれだけ多くの作業を行っています。
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>'
}
})
しかし、私が行き詰まっているのは、より高度な機能を追加するようになったときです。
テンプレートでデフォルト値をサポートするにはどうすればよいですか?
「type」パラメータをディレクティブのオプション属性として公開したいと思います。例:
<form-input label="Password" form-id="password" type="password"/></form-input>
<form-input label="Email address" form-id="emailAddress" type="email" /></form-input>
ただし、何も指定されていない場合は、デフォルトでにしたいと思います"text"
。どうすればこれをサポートできますか?
属性の有無に基づいてテンプレートをカスタマイズするにはどうすればよいですか?
また、「必須」属性が存在する場合は、それをサポートできるようにしたいと思います。例えば:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
required
ディレクティブにが存在する場合は<input />
、出力で生成されたものに追加し、それ以外の場合は無視します。これを達成する方法がわかりません。
これらの要件は単純なテンプレートを超えており、プリコンパイルフェーズの使用を開始する必要があると思われますが、どこから始めればよいのか途方に暮れています。