Предполагая, что у нас есть два контроллера AngularJS в отдельных файлах, которые включены в файл HTML, например:
//////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, я хотел бы выполнить некоторую операцию Cookie, поэтому вам нужно включить ngCookies. Если я делаю это внутри ////controller1.js, тогда контроллер2 не будет определен. Я предпочитаю включать модули именно там, где они мне нужны, а не где-то еще. Как я могу достичь этого без "удаления" последующих контроллеров?
EDIT: Если я переведу ngCookies от контроллера2 к контроллеру1, я получаю это сообщение об ошибке (Argument 'controller2' не является функцией, получившей неопределенное значение)
Вы можете сделать это, создав различные модули, как показано ниже. Также это предпочтительный способ, когда мы хотим модулизировать наше приложение.
//////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>
Может, что-то в этом роде?
//////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>'
Когда вы даете второй аргумент угловому модулю, например angular.module('MYAPP',['ngCookies'])
, вы определяете новый модуль и связанные с ним зависимости. Если вы не включаете второй аргумент (зависимости), то функция действует как "getter" и просто возвращает ссылку на этот модуль, с помощью которого вы можете зарегистрировать больше контроллеров/служб/и т.д. Если вы указали angular.module('MYAPP', ['ngCookies'])
несколько раз, вы перезаписываете свой предыдущий модуль MYAPP, поэтому Controller1, похоже, "стирается",
Поскольку вы включили ngCookies через 'angular.module(' MYAPP ', [' ngCookies ']) уже в файл, в котором находится Controller2, вам не нужно делать это снова в файле, в котором находится Controller1. используйте $ cookies только отлично Controller1 - просто убедитесь, что вы его ввели. т.е.
someApp.controller('Controller1', function($scope, $cookies) {
$scope.CookieFunction = function(){
//foo
};
});
Проблема в примере кода следующая (смените [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
})
Наконец, включите js файлы в html
<script src="////app.js"></script>
<script src="////controller1.js"></script>
<script src="////controller2.js"></script>