在这里,我们将讨论更常用的
控制容器反转:延迟加载(延迟加载)、生命周期
管理(生命周期管理)和延迟
创建处理(延迟创建解析)。
延迟加载(延迟加载)
所谓的延迟加载,当你需要使用一个对象来实例化它。许多依赖注入
系统创建
组件开始,作为一个可靠的方案。但有时候,你不想实例化这些组件直到你在你的
应用程序中使用它们。角是一个很好的例子,你建立了一个行为时,你
配置,和行为会涉及到一些组件还没有被创建。
假设你想拦截系统内建的$日志
服务,所以你有rootscope.of美元,当然我不
推荐这样做,但这是一种简单有效的例子。为了拦截,你用美元在配置和调用提供的
修改方法,如果你想把美元rootscope直接在这个时候,你会由于循环引用例外。
解决的办法是通过喷油器rootscope美元美元延迟加载。
下面的代码将只加载它时rootscope美元是第一次使用。
provide.decorator美元(,{,}
($委托,注入器){
日志= $(美元delegate.log.bind代表);
delegate.log美元=(MSG){
RS = $()injector.get;
(rs.logs = undefined){
rs.logs = { };
}
Rs.logs.push(MSG);
日志(MSG);
};
为代表;
});
下面的调用都将得到rootscope.here美元同单案就是一个例子。我似乎听到了(
错误的)声明之前(角只
支持一个单一的
情况下),这不是真的,当然,在$注射器的方法用于管理您的组件的生命周期。
生命周期管理
生命周期包括如何管理一个组件的一个实例。
默认情况下,当你将一个角的依赖,依赖注入,将帮助您创建一个副本并重新使用它在您的应用程序。在大多数情况下,这确实是我们所期望的。在某些情况下,同一组件的多个实例将被要求假设下面的计算服务:
计数器($ log){
log.log(美元);
}
Angular.extend(counter.prototype,{
计数:0,
增量:(){
计数= 1;
数;
}
});
计数器$注入= {;
app.service(,计数器);
您的应用程序将遵循不同的计数器。当您注入服务时,您得到相同的计数器。这是角的限制吗
当然不是。重复一次,用注入器服务,你可以随时创建一个新的拷贝:
App.run({,}
(RS,c,i){
rs.count = c.count;
rs.update = c.increment;
rs.update2 =(){()
C = i.instantiate(计数器);
rs.count2 = c.count;
rs.update2 =(){()
c.increment();
rs.count2 = c.count;
};
};
});
您可以看到计数器是由一个
独立的实例跟踪的,这里是一个示例。如果您需要
经常生成新实例,可以
注册如下的服务:
app.factory(,{,}
(一){
{
GetCounter:(){
I.instantiate(计数器);
}
};
});
生成一个您需要的实例非常简单,您可以使用工厂组件而不是注入器:
App.run({,}
(RS,cf){
C1 = cf.getcounter(),
C2 = cf.getcounter();
rs.count = c1.count;
rs.update = c1.increment;
rs.count2 = c2.count;
rs.update2 =(){()
rs.count2 = c2.increment();
};
});
您可以查看完整版本的可用示例。正如您所看到的,使用内置的依赖注入角,完全可以管理组件的生命周期。延迟解析是什么例如,在配置了角值后需要引入一些组件,需要用它们的依赖项
打包。
延迟处理(延迟解析)
我们
介绍一种角延迟处理依赖的方法。当你想收拾一些东西,你可以叫$喷油器服务实例化,那么可以通过
参数查找解决依赖,看起来像静态
属性注入美元,或者你可以
检查你的通过数组实现,也就是说,下面是一个完全有效的写作方式:
injector.instantiate美元({ 'dependency,构造
函数});
您还可以调用带有装饰数组的方法:
MyFunc = {,($日志){
log.log(美元);
} };
injector.invoke美元(myfunc);
你可以看看这个可用的例子(打开你的控制台,看看按下按钮后会发生什么)。
总结
综上所述,角的依赖注入提供了许多先进的
功能,你会想要和经常使用的商业应用生产线,工厂和供应商,服务的便利,使角开发商往往以为只有唯一的选择这里。神奇的是$喷油器的服务,而你可以用来生成所需的单身者,创建新的组件,或动态的
参考方法的依赖。
最后一点要注意的是,客户机代码中的注入可以在角外也可以使用。让我们来看一个包在角外的情况,这里是通过注入一个调用日志服务的例子来说明。为什么要在一组方法中放入NG它是角的
核心模块。当您打包模块时,它将隐式地添加,但是如果您的指令想要生成自己的实例,则必须显式地添加它。