2017 年 3 月 23 日更新:
AngularJS >= 1.3の場合、入力名で補間がサポートされるようになりました。
2014-06-05 からの元の回答 (AngularJS <= 1.2 で正しい):
昨日、動的に名前が付けられたフォーム要素に関する同様の質問に答えました。要するに、補間を使用してフォーム フィールドに動的に名前を付けることはできません。これまで見てきたように、補間文字列がフィールド名になります。
あなたの場合、myField
ディレクティブ内の入力 HTML を動的にコンパイルすることを検討する必要があるでしょう。
$compile
フォーム要素を動的に生成するために使用する簡単な例を次に示します: http://jsfiddle.net/Sly_cardinal/XKYJ3/
HTML:
<div ng-app="myApp">
<form name="myForm" ng-controller="myController">
<div my-field
name="courseName"
field="course.courseName"
title="Course Name"></div>
<div my-field
name="credits"
field="course.credits"
title="Credits"></div>
<!-- Show that the values are bound. -->
<pre>course: {{course | json:' '}}</pre>
<!-- Show that the field is being registered with the ngFormController. -->
<pre>myForm.credits.$dirty: {{myForm.credits.$dirty}}</pre>
</form>
</div>
JavaScript:
angular.module('myApp', [])
.controller('myController', ['$scope', function($scope){
$scope.course = {
credits: 100,
courseName: 'Programming 201'
};
}])
.directive('myField', ['$compile', '$parse', function($compile, $parse){
// In a real project you'd probably want to use '$templateCache' instead
// of having strings in your code.
var tmpl = $compile('<label>{{title}}</label>');
return {
scope: true,
link: function(scope, element, attr){
scope.title = attr.title;
var newEl = angular.element('<input type="text"/>');
newEl.attr('ng-model', attr.field);
newEl.attr('name', attr.name);
tmpl(scope, function(fieldEl, scope){
$compile(newEl[0].outerHTML)(scope, function(el, scope){
fieldEl.append(el);
element.append(fieldEl);
});
});
}
}
}]);
この例に関する注意:
これは非常に特殊な状況 (動的フォーム要素の生成) であり、 を使用する必要があります$compile
。これは、Angular の入力とフォームを操作する場合の "go to" ソリューションではありません。Angular は、ディレクティブ、データ バインディング、およびフレームワークが提供するその他すべての一般的な状況を処理します。さらに、Marc Kline のコメントが示すように、Angular は将来のある時点で動的フォーム管理自体を処理するように見えます。
これらのフォーム要素を生成するために使用するパスを続行する場合は、ディレクティブ内のテンプレート文字列を管理しようとしないように$compile
、おそらく$templateCacheを使用してテンプレートを管理することをお勧めします。