2016-08-08 2 views
0

Я видел много примеров в Интернете, показывая следующие основные AngularJS код:Неправильно ли объявлять глобальную переменную приложения в Angular?

var app = angular.module("ExampleApp", []); // setter, creates a new module 

app.controller(... 

и в других файлах, которые находятся под тем же угловым модулем:

var app = angular.module("ExampleApp"); // getter, retrieves the existing module 

app.service(... 

Это читает в память ГЛОВАЛЬНЫЙ переменная «app», доступная для других файлов. Второй файл работает, если я избавлюсь от «getter» и сразу начну с app.service(....

Я предполагаю, что это неправильная практика, чтобы не использовать геттер и просто использовать глобальную переменную, но мне интересно, является ли неправильная практика объявлять глобальную переменную вообще. Мои первые мысли состоят в том, чтобы обернуть каждый файл в IIFE, чтобы локально охватить переменные или избавиться от части var app и просто соединить .controller, .service и т. Д. Прямо на angular.module().

Заранее благодарим за профессиональный совет.

+0

Будет ли 'app.myGlobal = 'hello world'' работать не будет? – evolutionxbox

+0

Это та же проблема, что и любая другая глобальная переменная. Да, это, безусловно, может повлиять. В производстве вы, вероятно, действительно обернули бы его в IIFE, возможно, ваша фактическая система сборки Javascript будет делать это при компиляции/упаковке вашего Javascript. – deceze

+0

Как вы знаете, что 'var app' - глобальная переменная? Вы уверены, что он не находится внутри модуля (commonjs/ES6)? – Bergi

ответ

2

Поскольку глобальные переменные изменяются повсеместно, они более безопасны и более пригодны для обслуживания, чтобы не использовать глобальные переменные. Обычно я создаю свои модули в первое место расслоение плотной файла:

angular.module("ExampleApp", []); 

и получить в everyfile без присвоения переменной:

angular.module("ExampleApp") 
    .service("MyService", function() {}); 

или

angular.module("ExampleApp") 
    .component("MyComponent", {}); 

Если мне нужно некоторые переменные I использование:

(function() { 
    var myController = function() {}; 

    myController.$inject = ["$scope"]; 

    angular.module("ExampleApp") 
     .controller(myController); 
})(); 

Также использование комплектов, таких как Webpack или Browserify, является хорошим вариантом. Они автоматически создают области для js-файлов. Поэтому вам не нужно использовать сразу вызываемые функции, чтобы скрыть переменные из глобальной области. Например:

var myController = require('./MyController.js'); 
var myApp = require('./ExampleApp.js'); 

myApp.controller(myController); 

здесь, с WebPack, myController и myApp переменные не являются глобальными переменными. Простой и чистый ...

0

Это зависит от того, как вы его используете, иногда мы нуждаемся в нем глобально, но иногда нет, но предпочитаем избегать любых глобальных переменных, поэтому при написании угловых модулей мы будем использовать функцию self invoking, чтобы избежать доступа к глобальным значениям. Другими словами, если у вас не так много сложностей, вы можете использовать глобальные переменные, но когда у вас есть сложная проблема, не используйте их, потому что вы можете использовать несколько фреймворков, и возможно, что ваши переменные могут конфликтовать с теми, что есть в рамках, и могут легко вызывают проблемы, которые даже не поймут, почему это произошло.

Смежные вопросы