7

如果我有这样的指令

JS:

app.controller('MyController', function($scope) {
  this.someMethod = function() {
  };
});

app.directive('myDirective', function() {
  return {
    scope: true
    link: function(scope, elem, attrs, controller) {
      controller.someMethod();
    }
    controller: 'MyController',
  }
});

我想创建一个 Jasmine 间谍以确保调用链接函数controller.someMethod,但这不起作用:

规格:

var elem = angular.element('<div my-directive></div>');
var scope = $rootScope.new();
$compile(elem)(scope);

var ctrl = elem.controller('myDirective');
spyOn(ctrl, 'someFunc').andCallThrough();

间谍创建得太晚了,因为控制器被实例化并且在$compile语句中调用了链接函数。

还有什么其他方法可以监视链接功能中发生的事情?是否可以事先实例化控制器并将其传递给$compile

4

1 回答 1

7

来自AngularJS 开发人员指南的 Directives 页面

最佳实践:当您想将 API 公开给其他指令时使用控制器。否则使用链接

我建议为任何事情创建服务someMethod()。然后,您可以模拟和监视该服务。否则,您可能不得不寻找其他迹象表明您想要发生的事情已经发生了。

于 2014-03-14T16:40:08.897 回答