2016-08-08 64 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.service(...開始。

我認爲這是一個不好的做法,不要使用getter,只是首先使用全局變量,但是我想知道在全部處聲明全局變量是不好的做法。我的第一個想法是變量包中的每個文件的IIFE在本地範圍,或擺脫var app部分,只是鏈.controller.service等權到angular.module()

預先感謝您的專業意見。

+0

會'app.myGlobal =「你好world''不行? – evolutionxbox

+0

這與其他任何一種全局變量都是一樣的問題。是的,它肯定會產生影響。在生產中,你可能確實將它包裝在一個IIFE中,可能你的實際製作的Javascript構建系統會在編譯/打包你的Javascript時做到這一點。 – deceze

+0

你怎麼知道'var app'是一個全局變量?你確定它不在(commonjs/ES6)模塊中嗎? – Bergi

回答

2

爲全局變量是可變的,無處不在,它是更安全,更易於維護的不使用全局變量。我一般在第一個地方的js文件創建我的模塊:

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

並獲得everyfile不分配給一個變量:

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

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

如果我需要一些變量我使用功能:

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

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

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

同樣使用打包機如WebpackBrowserify是一個不錯的選擇。他們會自動爲每個js文件創建範圍。因此,您不需要立即使用調用的函數來隱藏全局範圍的變量。例如:

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

myApp.controller(myController); 

在這裏,用的WebPack,myControllermyApp變量不是全局變量。簡單幹淨...

0

這取決於你如何使用它有時我們需要在全球範圍,但有時不是,但最好是避免任何全局變量,這就是爲什麼而寫角模塊,我們將使用自調用功能,避免進入全球價值。 換句話說,如果你沒有太多的複雜性,你可以使用全局變量,但是當你有一個複雜的問題,避免使用它們,因爲你可能會使用不同的框架,它可能是你的變量可以與那些在框架,可以很容易產生衝突導致甚至不明白爲什麼會發生的問題。