2013-10-02 117 views
3

我似乎无法添加控制器后,我引导AngularJS。我得到的异常表明传递的控制器函数不是函数。但是,在Chrome调试器中,它显示为预期的功能。AngularJS控制器未注册

(我认识到,我不使用初始化AngularJS,我探索框架的声明样式。)

异常

Error: Argument 'MediaLoaderController' is not a function, got undefined 
    at Error (<anonymous>) 
    at $a (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:16:453) 
    at qa (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:17:56) 
    at $get (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:52:219) 
    at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:43:348 
    at m (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:6:494) 
    at i (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:43:213) 
    at e (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:39:307) 
    at e (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:39:324) 
    at e (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js:39:324) angular.min.js:62 
(anonymous function) angular.min.js:62 
$get angular.min.js:52 
$get.e.$apply angular.min.js:88 
(anonymous function) angular.min.js:16 
d angular.min.js:27 
c angular.min.js:16 
rb angular.min.js:16 
Bootstrapper.instance.bootstrapAngularJS bootstrapper.js:19 
(anonymous function) slide_template_angularjs.jsp:20 
x.Callbacks.c jquery.js:3048 
x.Callbacks.p.fireWith jquery.js:3160 
x.extend.ready jquery.js:433 
q 

HTML

<html> 
    <head> 
     <title></title> 
     <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>   
     <script src="/js/bootstrapper.js"></script> 
     <script language="JavaScript"> 

      var bootstrapper = null; 
      var controllerLibrary = null; 

      $(document).ready(function(){ 
       bootstrapper = new Bootstrapper(); 
       controllerLibrary = new ControllerLibrary(); 

       bootstrapper.bootstrapAngularJS(); 
       bootstrapper.myModule.controller("MediaLoaderController", controllerLibrary.MediaLoaderController);    
      }); 
      </script> 
    </head> 
    <body> 
     <div ng-controller="MediaLoaderController"> 
      {{status}} 
     </div> 
    </body> 
</html> 

JavaScript

function Bootstrapper() { 

    var instance = new Object(); 

    instance.myModule = null; 
    /* 
    * Bootstrap AngularJS and initialize myModule 
    */ 
    instance.bootstrapAngularJS = function() { 
     instance.myModule = angular.module('myModule', []); 
     angular.bootstrap(document, ['myModule']); 
    }; 

    return instance; 
} 


function ControllerLibrary() { 
} 

ControllerLibrary.prototype.MediaLoaderController = function($scope) { 
    $scope.status = "loading"; 
}; 
+0

它适用于全局定义'MediaLoaderController'(函数MediaLoaderController(){...}'),但我不确定这是你想要的。 – Langdon

+0

@Langdon:谢谢。是的不是。试图尝试如何组织和执行的东西。我所能想到的是,AngularJS以某种方式“欺骗”,而不是真正把调用函数引用给controller()。 –

回答

3

您必须在启动引导程序之前注册控制器,否则AngularJS无法找到控制器并抛出错误。在这里看到工作plunker。下面摘录。

function Bootstrapper() { 
    var instance = new Object(); 
    instance.myModule = angular.module('myModule', []); 
    instance.bootstrapAngularJS = function() { 
     angular.bootstrap(document, ['myModule']); 
    }; 
    return instance; 
} 

$(document).ready(function(){ 
    bootstrapper = new Bootstrapper(); 
    controllerLibrary = new ControllerLibrary(); 
    bootstrapper.myModule.controller("MediaLoaderController", controllerLibrary.MediaLoaderController);    
    bootstrapper.bootstrapAngularJS(); 
}); 
+0

非常感谢您的帮助! –

+1

不客气! –

+0

假设我们确实想在启动角度后添加控制器(例如ng-controller节点一开始不存在,但稍后由Angular之外的某个AJAX添加),那么我们可以重新启动Angular以查找新控制器吗? – Wouter

相关问题