在阅读John Papa的AngularJS style guide on IIFEs后,我开始将所有文件包装在IIFE中。当我将我的菜单指令文件包装在IIFE中时遇到了问题。测试失败声称我的菜单指令的控制器未定义。
ReferenceError:未定义MenubarController 在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:2473) at Object.invoke(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular/angular.js:9:139719) at Object.workFn(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular-mocks/angular-mocks.js:9:69713) TypeError:无法读取未定义的属性'loadCurrentUser' 在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:3634) 错误:未刷新的请求:1 在函数。$ httpBackend.verifyNoOutstandingRequest(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular-mocks/angular-mocks.js:9:45282) 在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:2853)
我的代码太长了,无法在此发布;我已经提供了github repo commit的链接:
测试在IIFE之前通过,但在添加IIFE后失败。然而,其他测试通过了;所有其他控制器,服务等,即使在添加IIFE之后。有什么想法吗?
编辑:请注意,构建应用程序并部署它会导致应用程序没有错误。菜单指令呈现并按预期工作。
答案 0 :(得分:1)
由于该指令包含在iife上,因此您无法访问MenubarController
对象on the test。改为使用字符串:
ctrl = controller('MenubarController', deps, data);
在指令文件中,您必须在角度模块中注册具有相同名称的控制器,并将其按字符串添加到指令中:
.directive('menubar', function() {
return {
templateUrl: 'menubar/menubar.html',
restrict: 'E',
scope: {},
bindToController: {
appname: '=',
tabs: '='
},
controller: 'MenubarController',
controllerAs: 'vm'
};
})
.controller('MenubarController', MenubarController)