2016-07-20 2 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> 

Внутри controller1, я хотел бы выполнить некоторые операции Cookie, поэтому необходимо включить ngCookies. Если я делаю это внутри controller1.js, тогда контроллер2 не будет определен. Я предпочитаю включать модули именно там, где они мне нужны, а не где-то еще. Как я могу достичь этого без «удаления» последующих контроллеров?

EDIT: Если я перехожу ngCookies включение из controller2 в controller1, я получаю сообщение об ошибке (Аргумент «controller2» не является функцией, получил неопределенный)

+0

Вы не можете «стереть последующие контроллеры», если они не имеют то же имя ... что вы имеете в виду?Что делает _ «Если я делаю это внутри controller1.js, тогда контроллер2 становится неопределенным.» Означает? Вам нужно будет уточнить, потому что ваш вопрос чрезвычайно расплывчатый, как есть. – matmo

+0

Я обновил код выше. Это означает, что если я переведу включение ngCookies из контроллера2 в контроллер1 (где я его фактически использую), тогда контроллер2 станет неопределенным !? –

ответ

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 
}) 

Наконец включают JS файлы в HTML

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

Typo, обновленный пример. Все еще не работает;) –

+0

Обновленный ответ, почему бы не упростить 1 файл app.js? –

+0

Потому что это не единственный используемый код;) Мне не нужен весь код в одном файле. Давайте просто предположим, что у меня много отдельных файлов, и это не изменится. Правильно ли я говорю, что я могу включать только модули в ОДНОМ файле (а не везде, где он мне нужен), и поэтому всегда нужно возвращаться к этому файлу, чтобы увидеть, включил ли я все необходимые модули !? –

0

Когда вы даете второй аргумент angular.module, такие как 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 
    }; 
}); 
+0

Да, я знаю об этом. Я не хотел включать ngCookies в оба файла, JUST IN controller1.js. Но почему я не могу этого сделать, не получив без контроллера2.js? –

+0

Поскольку angular.module ('moduleName') по существу является «getter», а angular.module ('moduleName' ['dependency1', 'dependency2', 'etc']) является «setter». Когда вы устанавливаете его более одного раза, вы в основном перезаписываете первый экземпляр. Когда вы указываете второй аргумент, он в основном объявляет новый модуль и его зависимости. Вам нужно сделать это только один раз. Вы можете использовать синтаксис getter (только 1 аргумент) столько, сколько хотите зарегистрировать больше контроллеров/директив/служб/etc в модуле столько, сколько хотите. – 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>` 
Смежные вопросы