为什么我需要在我的应用程序中注入我想要的控制器?

时间:2015-03-26 00:15:56

标签: angularjs

我正在阅读应用程序的源代码,内容如下:

angular.module('graffio', [
  'graffio.signupController',
  'graffio.loginController',
  'graffio.mainController',
  'ui.router'
])

我有很多问题!这么多困惑......

  1. 如何加载这些后面定义的控制器的代码 码?
  2. 为什么我甚至需要说明我想要哪些控制器 应用程序吗?为什么我不能拥有我宣布的所有内容?
  3. 为什么有角度的文档会使用“注射”这个词。非常? ISN'吨 注射剂和需要剂一样吗?

1 个答案:

答案 0 :(得分:2)

使用Angular,您可以根据需要将尽可能多的代码分组到模块中。您可以将模块组合在一起,就像您正在查看的应用程序的作者一样。最终模块将包含所有依赖的模块以及自己的模块中的所有服务,配置块,路由,控制器,指令,过滤器等。

本作者选择将每个控制器放入自己的模块中。这就是主模块需要依赖于每个模块的原因。在我看来,这看起来有点矫枉过正,但它已经完成了,所有你需要做的就是理解它,不同意它。

回答你的其他问题:

代码如何加载这些控制器,这些控制器稍后在代码中定义?

当您的代码首次运行时,将声明所有模块,并填充指令,路由,控制器,服务等。什么都没用过。只要运行上面的代码,其他模块已经被声明,那么一切都很好(这可以通过构建过程完成,例如Grunt任务)。

然后,当document.ready事件发生时,Angular会在您的HTML中查找ng-app指令,该指令指出要加载哪个模块作为您的应用程序。然后它做它所谓的" bootstrap"该模块的过程。

为什么我甚至需要在我的应用中声明我想要哪些控制器?为什么我不能拥有我宣布的所有内容?

因为这位作者已将每个控制器放在自己的模块中。如果您将所需的所有控制器放入一个模块中,那么您就不需要像那样声明它们。

为什么有角度的文档会使用“注射”这个词。非常?不能注射吗?

排序。它类似于你要求依赖名称然后使用它。

require不同的是,您通常无法修改在运行时为给定依赖项检索的值。使用依赖项注入,如果您愿意,可以在运行时交换或修改依赖项(在应用程序正常启动之前,并使用它们将依赖项注入代码中)。

这非常适合测试,因此您可以使用模拟(假)版本的依赖项进行测试,而不是使用普通版本。想想一个服务,它调用从服务器获取一些数据并返回一个promise。您可以创建一个不会调用服务器的服务的模拟版本,只需立即返回一些测试数据。这使您的单元测试速度很快,并且意味着您不需要运行Web服务器来使其工作。