在指令的内部模板中单击ng不提供该功能

时间:2013-01-10 10:39:27

标签: javascript angularjs

ng-click未提供提醒。单击指令的内部模板时,不会显示警告框。

小提琴链接在这里:http://jsfiddle.net/NNDhX/

4 个答案:

答案 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>