在一般条款,您需要设备的某种基础设施来声明依赖关系并抽象声明的服务或模块的实例化。
鉴于角例中的问题,如果你退后一步,并在其上反映,一切都在通过角的angular.module
功能发生。
直观上,这必须如何“应用程序”和后来的应用程式(指令,服务,控制器)的更小的组件声明和与底层的依赖注入容器中注册。毕竟,所有这些需要依赖数组作为第二个参数:
var injectable3, injectable2, injectable;
injectable = angular.module( 'myApp', [dependency, ..., fn(d1, ...){}]);
injectable2 = injectable.controller('foo', [dependency, ..., fn(d2, ...){}]);
injectable3 = injectable.service( 'bar', [dependency, ..., fn(d3, ...){}]);
这似乎不可思议,但它真的不是。他们都通过某种依赖注入容器进行交谈。 loader.js
审视一些核心方法的角度:这是在的意见实际上指出:
/**
* @name angular.bootstrap
* @returns {auto.$injector} Returns the newly created injector for app.
*/
function bootstrap(element, modules, config) {
// (...)
var doBootstrap = function(element, modules, config) {
modules = modules || [];
modules.unshift(['$provide', function ($provide) {
$provide.value('$rootElement', element);
}]);
if (config.debugInfoEnabled) {
modules.push(['$compileProvider', function ($compileProvider) {
$compileProvider.debugInfoEnabled(true);
}]);
}
// (...)
modules.unshift('ng');
var injector = createInjector(modules, config.strictDi);
injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
function bootstrapApply(scope, element, compile, injector) {
scope.$apply(function() {
element.data('$injector', injector);
compile(element)(scope);
});
}]
);
return injector;
};
// (...)
if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
return doBootstrap();
}
// (...)
}
如果不记得,引导方法负责初始化应用程序,如<body ng-app="coffeeShop">
。上面的摘录说明了为每个应用程序声明附加的依赖关系。下一步(createInjector
)将找出在哪里以及如何创建依赖关系。
所以总结一下,一个方法是声明供应商,具有一定的定位进行注册,然后声明依赖于供应商的模块,并最终引导了整个事情在以后的某个阶段。
我觉得我有我的填充这个星期天的早晨。
我第一句不同意,因为即使我使用的容器来定位“应用程序”在一个地方,它仍然用作一个服务到位的定位。除了App的预先配置的依赖关系之外,什么都没有被注入。如果我要为该项目添加一个后端(dep,dep,dep,...),我需要从容器中获取(定位服务)它。我不明白我怎么可以推广注入依赖到一个构造函数的过程。感谢您的链接。 –
你不应该从容器中获得'BackEnd',只有在你的情况下是'App'的根类。你用容器注册'BackEnd',然后在你的对象图中的某个地方注册一些类,例如通过构造器注入来依赖'BackEnd',然后容器将注入BackEnd到对象图中的适当位置。 –