如何创建单独的 AngularJS 控制器文件?

IT技术 javascript angularjs controller
2021-02-02 11:22:31

我的所有 AngularJS 控制器都在一个文件中,controllers.js。该文件的结构如下:

angular.module('myApp.controllers', [])
  .controller('Ctrl1', ['$scope', '$http', function($scope, $http) {    
  }])
  .controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
  }])

我想做的是将 Ctrl1 和 Ctrl2 放入单独的文件中。然后我会将这两个文件都包含在我的 index.html 中,但是应该如何构建呢?我尝试做这样的事情,但它在 Web 浏览器控制台中抛出一个错误,说它找不到我的控制器。任何提示?

我搜索了 StackOverflow 并发现了这个类似的问题 - 但是,这种语法在 Angular 之上使用了不同的框架(CoffeeScript),所以我一直没能跟上。


AngularJS:如何在多个文件中创建控制器

6个回答

档案一:

angular.module('myApp.controllers', []);

文件二:

angular.module('myApp.controllers').controller('Ctrl1', ['$scope', '$http', function($scope, $http){

}]);

文件三:

angular.module('myApp.controllers').controller('Ctrl2', ['$scope', '$http', function($scope, $http){

}]);

包括在那个顺序。我推荐 3 个文件,因此module声明是独立的。


至于文件夹结构,关于这个主题有很多很多很多意见,但这两个都不错

https://github.com/angular/angular-seed

http://briantford.com/blog/huuuuuge-angular-apps.html

@RuslanIsmagilov 你appCtrl是一个全球性的window.appCtrl. 这不是一个好的做法。
2021-03-14 11:22:31
@Andrew imho 未来的帮助和记录解决方案是 SO 的真正意义所在,而不是临时的 q 和 a。
2021-03-15 11:22:31
如果 OP 表示对 CoffeeScript 语法有混淆,也许最好不要在答案中使用它?
2021-03-17 11:22:31
@Fresheyeball,这种方法的问题是 index.html 中的导入顺序重要,否则,Angular 会发出错误。
2021-03-28 11:22:31
@hendryau,好吧,我正在使用 OP 中存在的module名称。也就是说,有些人认为在组织上更好,拥有多个命名空间module,而不是一个中央应用程序module。
2021-04-05 11:22:31

使用带有数组末尾的 angular.module API将告诉 angular 创建一个新module:

我的应用程序

// It is like saying "create a new module"
angular.module('myApp.controllers', []); // Notice the empty array at the end here

在没有数组的情况下使用它实际上是一个 getter 函数。所以要分离你的控制器,你可以这样做:

Ctrl1.js

// It is just like saying "get this module and create a controller"
angular.module('myApp.controllers').controller('Ctrlr1', ['$scope', '$http', function($scope, $http) {}]);

Ctrl2.js

angular.module('myApp.controllers').controller('Ctrlr2', ['$scope', '$http', function($scope, $http) {}]);

在您的 javascript 导入期间,只需确保myApp.js在 AngularJS 之后但在任何控制器/服务/等之前...否则 angular 将无法初始化您的控制器。

@JimmyAu 在哪里加载 Ctrl1.js 和 Ctrl2.js 以便页面可以使用它?我在 angular 之后加载了 myApp.js,但页面找不到控制器。我是否必须将它们显式添加为需要它的视图上的脚本?还是我仍然必须在每个页面上包含每个控制器文件?
2021-03-14 11:22:31
感谢您澄清为什么只有第一次调用需要 []。
2021-03-26 11:22:31
我应该在哪里写我的依赖项。var myapp = angular.module('demo', ['ngRoute','ngCookies','ui.bootstrap','nvd3ChartDirectives','ui-rangeSlider','textAngular','angularTreeview']);
2021-03-27 11:22:31
@vipin 就像您输入的内容一样,但请确保它位于任何控制器、服务等之上。从技术上讲,您不需要声明 var myapp = ...; 因为 angular 会为你存储它。
2021-04-09 11:22:31

虽然这两个答案在技术上都是正确的,但我想为这个答案介绍一个不同的语法选择。恕我直言,可以更轻松地阅读注射的情况,区分等。

档案一

// Create the module that deals with controllers
angular.module('myApp.controllers', []);

档案二

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl1
// to the module we got in the line above
.controller('Ctrl1', Ctrl1);

// Inject my dependencies
Ctrl1.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl1($scope, $http) {
  // Logic here
}

文件三

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl2
// to the module we got in the line above
.controller('Ctrl2', Ctrl2);

// Inject my dependencies
Ctrl2.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl2($scope, $http) {
  // Logic here
}
有趣的是,它确实让我不用去多个文件来注册一个控制器
2021-03-19 11:22:31
如果我可以 +1 这 1000 次,我会 - 太棒了!
2021-03-20 11:22:31
我相信它使代码更易于阅读。我知道到底注射了什么。将其视为逐行的“关注点分离”。
2021-03-28 11:22:31
我看到很多这样的编码。有什么好处?将 $inject 和一个函数分开。
2021-04-06 11:22:31
像这样的代码不仅产生更易读的代码,更容易调试,并且减少了嵌套回调代码的数量(参见github.com/johnpapa/angular-styleguide/blob/master/a1/...
2021-04-09 11:22:31

这个解决方案怎么样?文件中的module和控制器(在页面末尾)它适用于多个控制器、指令等:

应用程序.js

var app = angular.module("myApp", ['deps']);

我的Ctrl.js

app.controller("myCtrl", function($scope) { ..});

html

<script src="app.js"></script>
<script src="myCtrl.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">

谷歌还有一个关于 Angular 应用程序结构最佳实践建议, 我真的很喜欢按上下文分组。不是一个文件夹中的所有 html,而是例如用于登录的所有文件(html、css、app.js、controller.js 等)。所以如果我在一个module上工作,所有的指令都更容易找到。

为简洁起见,这里有一个不依赖全局变量的 ES2015 示例

// controllers/example-controller.js

export const ExampleControllerName = "ExampleController"
export const ExampleController = ($scope) => {
  // something... 
}

// controllers/another-controller.js

export const AnotherControllerName = "AnotherController"
export const AnotherController = ($scope) => {
  // functionality... 
}

// app.js

import angular from "angular";

import {
  ExampleControllerName,
  ExampleController
} = "./controllers/example-controller";

import {
  AnotherControllerName,
  AnotherController
} = "./controllers/another-controller";

angular.module("myApp", [/* deps */])
  .controller(ExampleControllerName, ExampleController)
  .controller(AnotherControllerName, AnotherController)
我不能让它工作。plnkr.co/edit/... - module“myApp”不可用!
2021-04-01 11:22:31
你可以节省相当位打字的,如果您使用命名的功能..他们有方便的属性name..所以,你可以简单地使用ExampleCtrl.name,而不是DUPL的.. triplicating它。
2021-04-08 11:22:31