为什么设置应用变量是一种不良做法'在angularJS?

时间:2015-05-14 13:52:14

标签: angularjs

我查看了一些angularJS教程和样式指南,并找到了这样的评论(from Todd Motto

Bad:
var app = angular.module('app', []);
app.controller();
app.factory();

Good:
angular
  .module('app', [])
  .controller()
  .factory();

我第一次学会了" Bad"通过示例的技术,并已经看到一些参考(除了这一个)说"坏"技术是......好坏。

我的搜索到目前为止还没有人说为什么这么糟糕?

修改 为什么这个问题有所不同? 虽然这与提出的重复问题之间的差异很微妙,但有两个重要的区别:

  1. '最佳做法是什么?'与“为什么不好?”不一样?' ...虽然对另一个问题的接受答案详细阐述了“为什么”,但这两个问题具有相同的答案是不够的被标记为副本。

  2. 使用我作为此问题标题的确切文本进行了有力的搜索,但没有透露建议的副本。也许SE应该考虑允许"可选的标题"被添加到一个问题以增强搜索能力......但是这个功能还没有到位,而其他人问我同样的问题仍然没有找到另一个问题。

2 个答案:

答案 0 :(得分:9)

全局变量通常被认为是不好的做法,虽然angular本身就是一个全局变量,所以我认为只要你是一致的,它就不会 大部分交易

如果你不小心做了这样的事情,可能会出现问题:

app = angular.module("app");
// some other file
app = somethingNotAnAngularModule();

外部库可能会覆盖变量app等等。

您也可以使用特定于您的应用的名称,而不是使用名称app ...

dustrModule = angular.module("dustr", []);

链接是一回事,但如果您将组件拆分为单独的文件,您始终可以获取模块.module

// app.js
angular.module("app", []);

// LoginCtrl.js
angular.module("app").controller("LoginCtrl", LoginCtrl);

答案 1 :(得分:3)

不使用var module = angular.module('foo', []);然后使用变量的全部意义纯粹是自以为是。做这个IMO没什么不好的,特别是如果你把它与browserify结合起来并做到这一点:

富/ FooModule.js:

var ng = require('angular');

module.exports = ng.module('Foo', []);

富/ FooController.js:

var FooModule = require('foo/FooModule');

function FooController() {
    this.bar = 'bar';
}

FooModule.controller('FooController', FooController);

module.exports = FooController;

富/ FooRoutes.js:

var Router = require('base/Router');
var FooController = require('foo/FooController');

function initialize() {
    Router.route('/foo', 'FooController as foo');
}

module.exports = initialize;

main.js:

var FooRoutes = require('foo/FooRoutes');

FooRoutes();

嗯,比这更重要的是在定义控制器和工厂时不要使用匿名函数。

所以你

function MyCtrl($dep1) { ... }
function MyFactory() { ...}

然后

angular.module()
    .controller('my', ['$dep1', MyCtrl])
    .factory('fac', MyFactory);

通过这种方式,您可以将实际代码与Angular依赖注入和声明分开,并将所有AngularJS内容保存在一个位置。

有些人告诉你第一种方法不好的原因是因为你正在分散" Angular的东西"到处都是,必须扫描整个代码才能找到实际的东西"。

还尝试使用立即调用的函数表达式(IIFE)来封装所有这些代码:

(function(){ /* code */ }());