Angular指令是否需要依赖注入控制器?

时间:2014-12-14 16:25:08

标签: javascript angularjs dependency-injection angularjs-directive

我知道当你将指令和控制器放在同一个文件中时,你就不会这样做。即

.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如何知道控制器中可用的指令?它们都可用吗?为什么要将它们全部用于指令而不是提供者呢?
  • 当指令和控制器在同一个文件中时,如果你不需要将指令注入控制器,会发生什么?

2 个答案:

答案 0 :(得分:3)

  

您是否必须从不同的文件中注入指令?

它不是基于文件,而是基于角度模块名称。有时一个模块的指令可以在同一个文件中定义,有时也可以在不同的文件中定义,但只要模块名称被正确声明,并且包含控制器的模块正确地依赖于包含该指令的模块,两种方式都可以工作。

执行此操作时:

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

然后myapp模块上定义的任何控制器都可以使用来自myappmod1mod2的任何指令(以及角度核心中的内置指令) )。

  

当指令和控制器在同一个文件中时,会发生什么情况,因此您不需要将指令注入控制器?

我认为你使用相同的模块混淆了同一个文件。在这种情况下,如果指令和控制器都在同一个应用程序中定义(在同一个文件中,但这不是必需的),那么控制器可以使用该指令。


看看上面的plnkr,一切都很好除了你忘记了一个基本要素 - 你的index.html实际上没有加载directive.js文件,所以加上这个:

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

然后指令正常工作。

答案 1 :(得分:1)

未注射指令。它们在您定义它们的模块中自动可用。