gpt4 book ai didi

angularjs - 单元测试 AngularJS 指令,该指令监视具有隔离范围的属性

转载 作者:行者123 更新时间:2023-12-03 23:41:35 25 4
gpt4 key购买 nike

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

指令:

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 = {}; });
});

我该怎么做才能触发监视,以便触发我的“监视中”调试语句?当我编译时,我的“链接中”被触发。

最佳答案

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

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

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

jsFiddler这就是例证。

关于angularjs - 单元测试 AngularJS 指令,该指令监视具有隔离范围的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17979282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com