2016-07-20 73 views
0

假設我們是在獨立的文件中的兩個AngularJS控制器包含在HTML文件中,這樣模塊之間包括:AngularJS:分離控制器

//controller1.js 
"use strict"; 
var someApp = angular.module('MYAPP'); 
//var someApp = angular.module('MYAPP',['ngCookies']); <-- Does not work 

someApp.controller('Controller1', function($scope) { 

    $scope.CookieFunction = function(){ 
     //foo 
    }; 
}); 


//controller2.js 
"use strict"; 
var someApp = angular.module('MYAPP',['ngCookies','ui.bootstrap']); 

someApp.controller('Controller2', function($scope,$cookies) { 

    $scope.SomeOtherfunction = function(){ 
     //foo 
    }; 
}); 

//HTML file 
<script src="controller1.js"></script> 
<script src="controller2.js"></script> 

內部控制器1,我想執行一些餅乾操作,因此需要包含ngCookies。如果我在controller1.js中這樣做,那麼controller2會變得不確定。我更願意將模塊包含在我需要的地方,而不是其他地方。如何在不「清除」後續控制器的情況下實現這一目標?

編輯:如果我提出ngCookies包括從控制器2到CONTROLLER1,我得到這個錯誤信息(參數「控制器2」不是一個函數,得到了未定義)

+0

你不能'擦除後續控制器',除非它們具有相同的名稱....你是什麼意思?什麼_「如果我在controller1.js中這樣做,那麼controller2會得到未定義。」_是什麼意思?你必須澄清,因爲你的問題是非常模糊的。 – matmo

+0

我更新了上面的代碼。這意味着如果我將ngCookies包含從controller2移動到controller1(我實際使用它),那麼controller2將變得不確定!? Typo, –

回答

0

您可以通過製作如下的不同模塊來實現。當我們想要模塊化我們的應用程序時,這也是優先選擇的方式。

//app.js 
"use strict"; 
var mainApp = angular.module('MYAPP', ['SomeApp', 'OtherApp']); 


//controller1.js 
var someApp = angular.module('SomeApp',['ngCookies']); 
someApp.controller('Controller1', function($scope,$cookies) { 

    $scope.CookieFunction = function(){ 
     //foo 
    }; 
}); 


//controller2.js 
"use strict"; 
var otherApp = angular.module('OtherApp ',[]); 

otherApp.controller('Controller2', function($scope) { 

    $scope.SomeOtherfunction = function(){ 
     //foo 
    }; 
}); 

//HTML file 
<script src="app.js"></script> 
<script src="controller1.js"></script> 
<script src="controller2.js"></script> 
-1

代碼示例中的問題是以下(其他城市[ngCookies]['ngCookies']

//controller1.js 
"use strict"; 
var someApp = angular.module('MYAPP',['ngCookies']); 

其他方法中,簡化了對1 app.js

// app.js 
"use strict"; 
var someApp = angular.module('MYAPP',['ngCookies']); 

someApp.controller('Controller1', function($scope) { 

    $scope.CookieFunction = function(){ 
     //foo 
    }; 
}); 

someApp.controller('Controller2', function($scope,$cookies) { 

    $scope.SomeOtherfunction = function(){ 
     //foo 
    }; 
}); 

//HTML file 
<script src="app.js"></script> 

簡化爲1,不同的控制器文件

如果你想保持在隨後單獨的文件控制器主要app.js,

app.js

var app = angular.module("testApp",['ngCookies','ui.bootstrap']); 

test1.js

app.controller("controller1",function(){ 
// some code 
}) 

test2.js

app.controller("controller2",function(){ 
// some code 
}) 

最後在HTML中包括

<script src="app.js"></script> 
<script src="controller1.js"></script> 
<script src="controller2.js"></script> 
+0

更新了示例。仍然沒有工作;) –

+0

更新的答案,爲什麼不簡化爲1 app.js文件? –

+0

因爲這不是唯一涉及的代碼;)我不希望所有代碼都放在一個文件中。讓我們假設,我有許多單獨的文件,並不會改變這一點。所以我正確地說我只能將模塊包含在一個文件中(而不是我需要它的地方),因此,總是必須跳回到該文件,以查看是否包含所有必需的模塊! –

0

js文件當你給一個第二個參數angular.module,如angular.module('MYAPP',['ngCookies']),要定義模塊和它關聯的依賴。如果你不包含第二個參數(依賴),那麼這個函數就像一個'getter'一樣,只是返回一個對該模塊的引用,你可以通過它來註冊更多的控制器/服務等。如果你多次指定angular.module('MYAPP', ['ngCookies']),那麼你正在覆蓋你以前的'MYAPP'模塊,這就是爲什麼Controller1似乎被「擦除」的原因

由於您通過`angular.module('MYAPP',['ngCookies' ])已經存在於Controller2所在的文件中,您不需要在Controller1所在的文件中再次執行該操作。您應該可以使用$ cookies就好了Controller1 - 只需確保注入它即可。即

someApp.controller('Controller1', function($scope, $cookies) { 

    $scope.CookieFunction = function(){ 
     //foo 
    }; 
}); 
+0

是的,我知道這一點。我不是說要在兩個文件中包含ngCookies,只是在controller1.js中。但爲什麼我不能這樣做,沒有controller2.js得到undefined呢? –

+0

由於angular.module('moduleName')本質上是一個'getter',而angular.module('moduleName'['dependency1','dependency2','etc'])是一個'setter'。當你「設置」它不止一次時,你基本上會覆蓋第一個實例。當你指定第二個參數時,它基本上聲明瞭一個新模塊及其依賴關係。你只需要這樣做一次。您可以儘可能多地使用getter語法(僅限1個參數),只要您想在模塊上註冊更多控制器/指令/服務/等。 – matmo

+0

但是這意味着,我只能在一個文件中包含模塊,而不是我實際需要的模塊。因此,如果我有20個單獨的文件,我總是必須記住包含必要模塊的位置並查找該文件以檢查是否包含所有必需的模塊。爲什麼(以及如果可以的話)我不能只將各個模塊包含在任何文件中? –

0

也許這樣的事情?

//app.js 
"use strict"; 
angular.module('MYAPP', ['myCtrl1', 'myCtrl2']); 

//controller1.js 
angular.module('myCtrl1', ['ngCookies']) 
    .controller('Controller1', function($scope) { 

    $scope.CookieFunction = function(){ 
     //foo 
    }; 
}); 


//controller2.js 
"use strict"; 

angular.module('myCtrl2',['ngCookies','ui.bootstrap']); 
    .controller('Controller2', function($scope,$cookies) { 

    $scope.SomeOtherfunction = function(){ 
     //foo 
    }; 
}); 

//HTML file 
<script src="app.js"></script> 
<script src="controller1.js"></script> 
<script src="controller2.js"></script>`