Почему установка переменной приложения является "плохой практикой" в angularJS?
Я просмотрел ряд обучающих руководств и стилей angularJS и нашел такие комментарии (от Тодд-девиза)
Bad:
var app = angular.module('app', []);
app.controller();
app.factory();
Good:
angular
.module('app', [])
.controller()
.factory();
Сначала я изучил технику "Плохая" на примере и с тех пор увидел пару ссылок (кроме этого), в которых говорится, что "Плохая" техника... хорошо Плохая.
Никто до сих пор в моих поисках говорит, ПОЧЕМУ это плохо?
Изменить: Почему этот вопрос отличается?
Хотя различия между этим и предлагаемым дублирующимся вопросом являются незначительными, существуют два важных отличия:
-
"Какая практика?" это не то же самое, что "Почему это плохо?"... в то время как принятый ответ на другой вопрос подробно объясняет "почему", два вопроса, имеющих один и тот же ответ, недостаточно, чтобы быть заклейминным дубликатом.
-
Яркий поиск, используя точный текст, который я разместил в качестве заголовка для этого вопроса, не выявил предлагаемого дубликата. Возможно, SE следует рассмотреть возможность включения "дополнительных заголовков" в вопрос, чтобы улучшить поисковую информацию... но эта функция отсутствует, и кто-то другой, задающий тот же вопрос, что и мой, все равно не найдет другого вопроса.
Ответы
Ответ 1
Глобальные переменные в целом обычно считаются плохой практикой, хотя 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);
Ответ 2
Весь смысл не использовать var module = angular.module('foo', []);
, а затем использовать переменную. Ничего плохого в том, что ИМО, особенно если вы соедините это с browserify, и выполните следующие действия:
Foo/FooModule.js:
var ng = require('angular');
module.exports = ng.module('Foo', []);
Foo/FooController.js:
var FooModule = require('foo/FooModule');
function FooController() {
this.bar = 'bar';
}
FooModule.controller('FooController', FooController);
module.exports = FooController;
Foo/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 материал" повсюду, вынуждая сканировать весь код, чтобы перейти к фактическому "материалу".
Также попробуйте использовать Expression Expression Expression (IIFE) для инкапсуляции всего этого кода:
(function(){ /* code */ }());