如何在单独的文件中定义控制器

时间:2017-02-24 10:18:05

标签: javascript angularjs

假设我有一个通过AngularJS 1.x写的SPA。

它有一个app模块定义如下:

var app = angular.module('app', ['ngAlertify', 'ngRoute', 'ui.bootstrap'])

我还有几个控制器,它们在不同的*Ctrl.js文件中定义。定义它们的适当方法是什么?

我在这里看到两个选项。第一个是

app.controller('LoginCtrl', function($scope) { /* ... */ });

,第二个是

angular.module('app').controller('LoginCtrl', function($scope) { /* ... */ });

哪一种更好,最常用的做法?使用其中任何一个都有任何缺点吗?

5 个答案:

答案 0 :(得分:1)

我个人的偏好是使用app.controller('LoginCtrl', function($scope) { /* ... */ });因为这样可以更容易地在另一个项目中重复使用控制器,几乎没有变化,没有那些令人讨厌的module not found错误,因为你在重用时忘了重命名模块文件

答案 1 :(得分:1)

我认为这取决于个人写作风格。有一点是,在使用 AngularJS 1.x.x时,您可以使用不同风格的代码编写,方法堆叠等。

就个人而言,我更喜欢app.controller('LoginCtrl', function($scope) { /* ... */ });,主要是因为您可以轻松预览控制器并将其与thge模块区分开来。我看到有一个明确定义的单独模块的另一个好处是,您可以轻松检查包含('ngAlertify', 'ngRoute', 'ui.bootstrap')的内容。

我所见过的最常用的,即使是在SO上,也是我之前提到过的方法。然而,这更多地反映了个人风格,而不是编写代码的强烈预先要求。我希望在某种程度上有所帮助。

答案 2 :(得分:1)

以上都不是。模块的目的是使应用程序保持模块化而不污染全局范围。

你可以拥有var app = ...,但这应该在每个文件的IIFE内完成。

模块的另一个问题是优先级。如果应用程序使用angular.module('app')模块getter,则应按特定顺序加载文件,以便在其他文件中检索模块时定义模块。这会产生问题,如果它们不是,例如当它们按字母顺序连接时。

解决方案是每个文件使用一个模块。这使得应用程序真正模块化,独立于文件加载顺序,也有利于可测试性。另请参阅this answer此模式应如何工作。

答案 3 :(得分:1)

如果我正确理解你的问题,那么你想知道

之间的不同
app.controller('LoginCtrl', function($scope) { /* ... */ }); 

VS

angular.module('app').controller('LoginCtrl', function($scope) { /* ... */ });

在上面两个第一个方法app中是一个全局对象,你在某个地方声明,即在app.js

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

在这种情况下,app是一个全局变量,可以在整个应用程序中访问。我认为使用全局变量并不是一件好事 在我们的申请中。

在第二种方法中,我们使用全局angular对象来创建一个控制器,这样我们就不会使用全局变量了。在这种情况下,app.js看起来像

(function(){
  'use strict';
  var app = angular.module('app', []);
    ....
    ....
    ....
    ....
})

在这种情况下,app变量在此文件之外的任何位置都不可用。

所以我相信第二种方法比第一种方法更好。

答案 4 :(得分:1)

您可以使用模块设置器和getter方法在不同文件中实现控制器。

假设myApp.module.js

angular.module('myApp', []); //Setter method, registring module

myApp.homeCtrl.js

var myApp = angular.module('myApp'); // getter method, getting the module already registered.
myApp.controller('homeCtrl', [function()]{ })

有关详细信息,请查看此https://toddmotto.com/angular-modules-setters-getters/

你正在采取的第二种方法更好,因为它使用已经创建的模块并且不创建新模块,但是第一种方法是使用不推荐的全局变量