gpt4 book ai didi

angularjs - 类型错误 : Cannot read property 'defaultPrevented' of undefined

转载 作者:行者123 更新时间:2023-12-04 02:38:40 25 4
gpt4 key购买 nike

执行以下测试时出现此错误:

it('should call pauseAnimationInterval if in focus', inject(function(SearchBoxData, intervalManager, $timeout){
SearchBoxData.init_array = [];
SearchBoxData.inFocus = true;
SearchBoxData.init(intervalManager);
console.log(intervalManager.pauseTimeout);
console.log(intervalManager.pauseTimeoutTime);
console.log($timeout);
$timeout.flush(intervalManager.pauseTimeoutTime+1);
expect(rootScope.$broadcast).toHaveBeenCalledWith('onPauseInterval', intervalManager.loopIndex);
}));

它在 $timeout.flush(intervalManager.pauseTimeoutTime+1); 上中断
$timeout 方法在 intervalManager.pauseAnimationInterval() 中调用。里面是 SearchBoxData.init(intervalManager) :
intervalManager.pauseAnimationInterval = function (){

intervalManager.safeCancel(intervalManager.continueInterval);
intervalManager.safeCancel(intervalManager.initInterval);
intervalManager.initInterval = null;
intervalManager.continueInterval = null;

intervalManager.pauseTimeout = $timeout(function () {
if(intervalManager.inFocus === true){
intervalManager.loopIndex += 1;
if(intervalManager.loopIndex >= intervalManager.maxLoopIndex){
intervalManager.loopIndex = 0;
}
$rootScope.$broadcast("onPauseInterval", intervalManager.loopIndex);
intervalManager.continueAnimationInterval();
}else{
// Important condition: retry after the timeout if no focus
// main reason of glitch
intervalManager.pauseAnimationInterval();
}
}, intervalManager.pauseTimeoutTime);

};

我之前没有收到此错误,我不确定我做错了什么。

更新:这是一个未缩小版本的 angularJS 的堆栈跟踪:
at /Users/foo/projects/bar/vendor/assets/javascripts/angular.js:9268:88
at Scope.$eval (/Users/foo/projects/bar/vendor/assets/javascripts/angular.js:11986:28)
at Scope.$digest (/Users/foo/projects/bar/vendor/assets/javascripts/angular.js:11812:31)
at Scope.$apply (/Users/foo/projects/bar/vendor/assets/javascripts/angular.js:12092:24)
at Object.fn (/Users/foo/projects/bar/vendor/assets/javascripts/angular.js:13627:36)
at Function.self.defer.flush (/Users/foo/projects/bar/spec/javascripts/lib/angular/angular-mocks.js:126:32)
at Function.$delegate.flush (/Users/foo/projects/bar/spec/javascripts/lib/angular/angular-mocks.js:1689:20)
at null.<anonymous> (/Users/foo/projects/bar/spec/javascripts/unit/services/searchboxdata_service_spec.js:71:16)

更新 2:我将其追溯到 SearchBoxData 的注入(inject)。工厂。我不确定它有什么问题。每当我创建 $timeout 实例并使用 flush 方法时,只需注入(inject)它就会导致错误。

更新 3:我注意到如果我在其中一个依赖项中注入(inject) $location 或 $route 会发生这种情况(间接依赖项,它发生在我到处使用的一些基本服务中)。

更新 4:这是一个重现它的 plunker! http://plnkr.co/edit/7XweXI?p=info

最佳答案

$broadcast()'d 或 $emit()'d 的作用域事件是同步的,并在它们完成时返回事件对象。

Angular 中的一些东西依赖于返回的事件对象,例如 ngRoute。

因此,您可以做些什么来解决这个问题,只需添加 andCallThrough()当您创建 spy 时,它会调用原始函数并产生返回值。

或者,如果您不想使用真正的 $broadcast,可以使用 andCallFake()提供一个可以返回任何你想要的东西的假函数。

例子:

beforeEach(function(){
module('MyApp');
inject(function($injector){
rootScope = $injector.get('$rootScope');
spyOn(rootScope,'$broadcast').andCallThrough(); // will prevent the reference error
})
});

关于angularjs - 类型错误 : Cannot read property 'defaultPrevented' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721657/

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