在阅读了John Papa的AngularJS style guide on IIFEs之后,我开始将所有文件包装在IIFE中。将菜单栏指令文件包装在IIFE中时遇到问题。测试失败,声称我的menubar指令的控制器未定义。


  ReferenceError:未定义MenubarController
          在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:2473)
          在Object.invoke(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular/angular.js:9:139719)
          在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
          在Function。$ 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的链接:

Menubar directives.js file

测试在IIFE之前通过,但在添加IIFE之后失败。但是,其他测试通过了。所有其他控制器,服务等,即使添加IIFE也是如此。有什么想法吗?

编辑:请注意,构建应用程序并对其进行部署可以使应用程序正常运行而不会出错。 menubar指令可按预期方式呈现和工作。

最佳答案

由于该指令包装在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)

07-26 06:58