ng-click
未提供提醒。单击指令的内部模板时,不会显示警告框。
小提琴链接在这里:http://jsfiddle.net/NNDhX/
答案 0 :(得分:16)
您的指令有自己的隔离范围。函数'hi'应该在指令的范围内。如果您想传递控制器的功能,您应该进行绑定,例如scope: { ..., hi: '&' }
然后<you-directive hi='hi' ..>
。以下是有关此文档的链接:Understanding Transclusion and Scopes。
所以只需在链接功能中添加就足够了:
link: function(scope, element, attrs) {
scope.hi = function() { alert("hi"); }
这是更新的小提琴:http://jsfiddle.net/GwBAh/
答案 1 :(得分:6)
我不知道这是否是最好的方法,但你可以使用$ parent in directive来访问父范围。
<a ng-click="$parent.hi();">parent</a>
以下是完整小提琴示例的链接:http://jsfiddle.net/EKDse/
答案 2 :(得分:1)
隔离范围的整个想法正是为了避免在父&lt; - &gt;子范围之间“共享”事物,以某种方式保护它们不被其他指令/控制器暴露和(无意地)改变。
如果你真的想避开隔离范围并分享父母的范围,请试试这个:
首先删除指令的范围定义(如下所示):
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/
答案 3 :(得分:0)
必须在transcluded块中调用指令内的控制器函数。在指令模板中使用控制器方法使得指令依赖于控制器,并且它的依赖性(指令外部控制器)是一种不合需要的设计。
在您的示例中,将<a>
代码转换为transcluded块。它使您的指令更加孤立并解决了问题:
<div class="zippy" zippy-title="Details: {{title}}...">
{{text}}
<a ng-click="hi();">hi</a>
</div>