13

我有一个指令,它使用隔离范围将数据传递给随时间变化的指令。它监视该值的变化并对每个变化进行一些计算。当我尝试对指令进行单元测试时,我无法触发手表(为简洁起见,但基本概念如下所示):

指示:

angular.module('directives.file', [])
.directive('file', function() {
  return {
    restrict: 'E',
    scope: {
      data: '=',
      filename: '@',
    },
    link: function(scope, element, attrs) {
      console.log('in link');
      var convertToCSV = function(newItem) { ... };

      scope.$watch('data', function(newItem) {
        console.log('in watch');
        var csv_obj = convertToCSV(newItem);
        var blob = new Blob([csv_obj], {type:'text/plain'});
        var link = window.webkitURL.createObjectURL(blob);
        element.html('<a href=' + link + ' download=' + attrs.filename +'>Export to CSV</a>');
      }, true);
    }
  };
});

测试:

describe('Unit: File export', function() {
  var scope;

  beforeEach(module('directives.file'));
  beforeEach(inject(function ($rootScope, $compile) {
    scope = $rootScope.$new();
  };

  it('should create a CSV', function() {
    scope.input = someData;
    var e = $compile('<file data="input" filename="filename.csv"></file>')(scope);
    //I've also tried below but that does not help
    scope.$apply(function() { scope.input = {}; });
  });

我可以做些什么来触发手表,以便触发我的“In watch”调试语句?编译时会触发我的“链接中”。

4

1 回答 1

16

$watch触发 a ,摘要循环必须发生在它定义的范围或其父级上。$apply由于您的指令创建了一个隔离范围,因此它不会从父范围继承,因此在您调用适当的范围之前,它的观察者不会得到处理。

scope()您可以通过调用服务返回的元素来访问指令范围$compile

scope.input = someData;
var e = $compile('<file data="input" filename="filename.csv"></file>')(scope);
e.isolateScope().$apply();

这个jsFiddler就是一个例子。

于 2013-08-01T07:01:12.273 回答