次のように、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"
ます。どうすればこれをサポートできますか?
属性の有無に基づいてテンプレートをカスタマイズするにはどうすればよいですか?
「required」属性がある場合は、それもサポートできるようにしたいと考えています。例えば:
<form-input label="Email address" form-id="emailAddress" type="email" required/></form-input>
required
ディレクティブに存在する場合、生成さ<input />
れた出力に追加し、それ以外の場合は無視します。これを達成する方法がわかりません。
これらの要件が単純なテンプレートを超えて移動し、プリコンパイルフェーズの使用を開始する必要があるのではないかと思いますが、どこから始めればよいか迷っています。
type
バインディングによって動的に設定された場合はどうなりますか。type="{{ $ctrl.myForm.myField.type}}"
?以下のすべての方法を確認したところ、このシナリオで機能する解決策は見つかりませんでした。テンプレート関数が 属性のリテラル値を見るように見えます。tAttr['type'] == '{{ $ctrl.myForm.myField.type }}'
の代わりにtAttr['type'] == 'password'
。私は困惑しています。