3

似乎我无法在单元测试中触发使用 transclude 的指令的事件,即使该指令在实际应用程序中工作正常。例如,这是一个简单的指令和单元测试,它会警告文本:

http://plnkr.co/edit/yPLVJp?p=preview(这会正确提醒)

现在这里是完全相同的代码,只是该指令有一个模板并使用了 transclude:

http://plnkr.co/edit/wAqY2h?p=preview(无论出于何种原因,这不会正确提醒)

是否有任何理由第二个使用 transclude 的指令没有像第一个那样正确触发单元测试中的警报?

4

1 回答 1

1

使用 transclude 的指令不会触发警报的原因是它具有隔离范围:

scope: {}

并且您在其中定义了回调:

post: function(scope, element, attributes) {
  scope.func = function($event) {
    alert('the unit test should trigger this');
  }
}

由于嵌入,指令和嵌入不共享相同的范围,而是从同一个父级继承(即使很难理解,请参阅文档)。如果您希望 transclude 元素访问由指令添加到作用域的元素,则指令不得创建新作用域并在父作用域中添加此函数:

scope: false,
...
post: function(scope, element, attributes) {
  scope.func = function($event) {
    alert('the unit test should trigger this');
  }
}

那么directive和transclude元素可以共享同一个作用域。

于 2013-06-29T13:01:08.410 回答