1

Я знаю, что когда у вас есть директива и контроллер в том же файле, вы этого не делаете. Т.е.Должны ли быть введены угловые директивы в контроллеры?

.directive('example', function() { 
}) 
.controller('MainCtrl', function($scope) { 
    // could use the example directive in the corresponding html 
}); 

Но я всегда думал, что когда директива находится в другом файле, вы должны вводить его в контроллер. Как это:

example.directive.js

.directive('example', function() { 
}) 

main.controller.js

.controller('MainCtrl', function($scope, example) { 
}); 

Смотрите эту plnkr. В нем директива и контроллер находятся в двух разных файлах, и директива не работает.

Примечание: В моем приложении я использовал angular-fullstack generator, чтобы создать директиву, а директива - это, доступная в контроллере, без необходимости вводить ее. Это из-за генератора?

В любом случае, когда я пытаюсь ввести директиву в контроллер, я получаю сообщение об ошибке unknown provider: exampleProvider.

Что здесь происходит?

  • Нужно ли вам вводить директивы из разных файлов? Если нет, как Angular знает, какие директивы должны быть доступны в контроллере? Все ли они доступны? Почему все они доступны для директив, но не для поставщиков?
  • Что происходит, когда директива и контроллер находятся в одном файле, чтобы сделать это, поэтому вам не нужно вводить директиву в контроллер?

ответ

3

Нужно ли вводить директивы из разных файлов?

Он не основан на файлах, он основан на именах угловых модулей. Иногда директивы из одного модуля могут быть определены в одном файле, иногда в разных файлах, но оба способа могут работать, если имена модулей объявлены правильно, а модуль, содержащий контроллер, правильно зависит от модуля, содержащего директиву.

Когда вы сделаете это:

angular.module('myapp' ['mod1', 'mod2']); 

Тогда любой контроллер, определенный на myapp модуль может использовать любую директиву от myapp, mod1 и mod2 (а также встроенные директивы в угловом ядре).

Что происходит, когда директива и контроллер находятся в одном файле, чтобы сделать это, поэтому вам не нужно вводить директиву в контроллер?

Я думаю, вы вводите в заблуждение тот же файл с тем же модулем. В этом случае, если и директива, и контроллер определены в одном приложении (в том же файле, но это не существенно), тогда контроллер может использовать директиву.


Глядя на ваш plnkr выше, все хорошо КРОМЕ вы забыли один основной ингредиент - ваш index.html не загрузит файл directive.js, так что добавьте это:

<script src="directive.js"></script> 

Тогда директива работает правильно ,

+0

Почему мой плнкр не работал? Директива была определена в том же приложении, что и контроллер. –

+1

Вы будете чувствовать себя глупо, но это основа. :-) Вам это нужно в вашем 'index.html':' ' –

+0

А, ок, я слишком привык к генераторам. Большое спасибо! –

1

Директивы не вводятся. Они автоматически доступны в модуле, в котором вы их определяете.