假设我有一个通过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) { /* ... */ });
哪一种更好,最常用的做法?使用其中任何一个都有任何缺点吗?
答案 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/
你正在采取的第二种方法更好,因为它使用已经创建的模块并且不创建新模块,但是第一种方法是使用不推荐的全局变量