【问题标题】:Using a child controller from another module使用来自另一个模块的子控制器
【发布时间】:2013-04-19 21:38:29
【问题描述】:

我已经定义了一个模块,并使用 ng-app 指令将其作为我的应用程序的主模块。我使用 angular.module('myApp').controller() 向主应用程序添加了两个控制器。其中一个控制器具有页面范围,而另一个控制器是子控制器。

我现在要做的是包含一个属于另一个模块(不是主 myApp 模块)的控制器,但我无法弄清楚。我不想全局命名空间控制器。

有人知道怎么做吗?

这是我目前所拥有的:

<!doctype html>
<html lang="en" data-ng-app='myApp' data-ng-controller='myApp.mainController'>
<head>
  <meta charset="utf-8">
  <title>Untitled</title>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script>
    $(function() {
      var app, module;

      //create two modules, one of which will be used for the app base
      app = angular.module('myApp', []);
      module = angular.module('otherModule', []);

      //create main controller for main app
      app.controller('myApp.mainController', function($scope) {
        $scope.content = 'App main controller content';
      });

      //create child controller for main app
      app.controller('myApp.subController', function($scope) {
        $scope.content = 'App sub controller content';
      });

      //create a controller for the other module
      module.controller('othermodule.controller', function($scope) {
        $scope.content = 'Other module controller content';
      });
    });


  </script>
</head>
<body>

  <!-- output content from main controller from main module: myApp -->
  {{content}}

  <!-- specify use of main module's child controller and output its content -->
  <div data-ng-controller='myApp.subController'>
    {{content}}
  </div>

  <!-- NOT WORKING - ideally should output content from the other module's controller -->
  <div data-ng-controller='othermodule.controller'>
    {{content}}
  </div>

  <!-- load angular library -->
  <script src="lib/angular/angular.js"></script>
</body>
</html>

此代码输出以下内容,其中包含一个 JavaScript 错误,本质上是说未找到 othermodule.controller 控制器。

App主控制器内容

App子控制器内容

{{内容}}

确切的错误:

> Error: Argument 'othermodule.controller' is not a function, got
> undefined
> assertArg@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:1005
> assertArgFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:1016
> @http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:4740
> applyDirectivesToNode/nodeLinkFn/<@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:4322
> forEach@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:140
> nodeLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:4307
> compositeLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:3953
> compositeLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:3956
> nodeLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:4338
> compositeLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:3953
> publicLinkFn@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:3858
> bootstrap/</<@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:964
> Scope.prototype.$eval@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:7993
> Scope.prototype.$apply@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:8073
> bootstrap/<@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:962
> invoke@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:2843
> bootstrap@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:961
> angularInit@http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:936
> @http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js:14729
> b.Callbacks/c@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3
> b.Callbacks/p.fireWith@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3
> .ready@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3
> H@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3
> 
> http://localhost/sandbox/angular/apptemplate/lib/angular/angular.js
> Line 5687

【问题讨论】:

    标签: angularjs angularjs-controller


    【解决方案1】:

    您目前所做的是“声明”了两个模块appmodule

    当 Angular 引导时,您已要求它使用 app 引导。所以现在您的应用程序使用app 引导,但app 没有引用您的其他模块(即module!)。

    因此,您必须使用 app 引导您的应用程序并指定对 module 的依赖项,或者使用全新模块引导您的应用程序并指定对 appmodule 的依赖项。

    这就是你定义依赖的方式

    angular.module('app',['module']);
    

    如果你想创建一个全新的模块并将两者都指定为依赖项

    angular.module('myApp',['app','module'])
    

    注意:如果你创建了一个全新的模块,你将不得不使用这个新模块来引导你的 Angular 应用程序。

    <html ng-app="myApp"...
    

    【讨论】:

    • 这 100% 有意义。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 2017-11-18
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2020-12-20
    相关资源
    最近更新 更多