ng-click
はアラートを提供していません。ディレクティブの内部テンプレートをクリックすると、アラート ボックスが表示されません。
フィドルのリンクはこちら: http://jsfiddle.net/NNDhX/
ng-click
はアラートを提供していません。ディレクティブの内部テンプレートをクリックすると、アラート ボックスが表示されません。
フィドルのリンクはこちら: http://jsfiddle.net/NNDhX/
ディレクティブには独自の分離スコープがあります。したがって、関数「hi」はディレクティブのスコープ内にある必要があります。コントローラーの関数を渡したい場合は、scope: { ..., hi: '&' }
and thenのようにバインディングを行う必要があります<you-directive hi='hi' ..>
。これに関するドキュメントへのリンクは次のとおりです: Understanding Transclusion and Scopes。
したがって、リンク関数に追加するだけで十分です。
link: function(scope, element, attrs) {
scope.hi = function() { alert("hi"); }
これが更新されたフィドルです:http://jsfiddle.net/GwBAh/
分離スコープの全体的な考え方は、親<->子スコープ間で物事を「共有」することを回避し、他のディレクティブ/コントローラーによって公開されたり(意図せずに)変更されたりするのを何らかの形で保護することです。
分離スコープを避けて親のスコープを共有したい場合は、これを試してください:
ディレクティブのスコープ定義を削除することから始めます (以下にコメント):
transclude: true,
/*scope: { title:'@zippyTitle' },*/
次に、ディレクティブ エレメントの属性 ( attrs
) をディレクティブのスコープに配置します。
scope.attrs = attrs;
注: これを行うと、attrs
プロパティは親 (Ctrl3) スコープでも使用できるようになります。
そして最後に、に基づいてタイトルを定義しますscope.attrs
template: '<div>' +
'<div class="title">{{attrs.zippyTitle}}</div>' +
'<div class="body" ng-transclude></div>' +
'<a ng-click="hi();">hi</a>' +
'</div>',
jsFiddle : http://jsfiddle.net/NNDhX/1/
ディレクティブ内のコントローラー関数は、transcluded ブロック内で呼び出す必要があります。ディレクティブのテンプレート内でコントローラー メソッドを使用すると、ディレクティブがコントローラーに依存し、その依存関係 (ディレクティブ-外部コントローラー) によって望ましくない設計になります。
サンプル<a>
では、コードの一部をトランスクルードされたブロックに翻訳します。これにより、ディレクティブがより分離され、問題が解決されました。
<div class="zippy" zippy-title="Details: {{title}}...">
{{text}}
<a ng-click="hi();">hi</a>
</div>