カスタム ディレクティブで指定されたテンプレートを含むビューがあります。カスタム ディレクティブで使用されるテンプレートは、「dynamicTemplate」に依存します。
意見:
<div ng-controller="MyController">
<custom-dir dynamicTemplate="dynamicTemplateType"></custom-dir>
<button ng-click="ok()">Ok</button>
</div>
ビューのコントローラー:
myModule
.controller('MyController', ['$scope', function ($scope) {
$scope.dynamicTemplateType= 'input';
$scope.myValue = "";
$scope.ok = function()
{
// Problem! Here I check for 'myValue' but it is never updated!
}
カスタム ディレクティブ:
myModule.directive("customDir", function ($compile) {
var inputTemplate = '<input ng-model="$parent.myValue"></input>';
var getTemplate = function (templateType) {
// Some logic to return one of several possible templates
if( templateType == 'input' )
{
return inputTemplate;
}
}
var linker = function (scope, element, attrs) {
scope.$watch('dynamicTemplate', function (val) {
element.html(getTemplate(scope.dynamicTemplate)).show();
});
$compile(element.contents())(scope);
}
return {
restrict: 'AEC',
link: linker,
scope: {
dynamicTemplate: '='
}
}
});
上記の例では、MyController にある 'myValue' をカスタム ディレクティブにあるテンプレートにバインドしたいのですが、そうはなりません。
動的テンプレート (つまり、ディレクティブのリンカーのコンテンツ) を削除し、代わりにハードコーディングされたテンプレートを返すと、バインディングが正常に機能することに気付きました。
// If directive is changed to the following then binding works as desired
// but it is no longer a dynamic template:
return {
restrict: 'AEC',
link: linker,
scope: {
dynamicTemplate: '='
},
template: '<input ng-model="$parent.myValue"></input>'
}
これがダイナミック テンプレートで機能しない理由がわかりません。
AngularJS 1.3.0 を使用しています。