依赖注入 DI(Dependency Injection)
依赖注入主要是将一个功能注入到另一个不想跟的模块里面去, 让这个功能变成这个模块的一部分,叫做依赖注入,类似在一个功能模块中调用另一个模块(模块化)
只是模块化是在一个调用的里面去主动引入和查找另一个被调用的模块,而依赖注入是被调用者主动声明,并将自己注入到调用者内部
AngularJS的依赖注入主要是将一些功能或者值注入到控制器中,这是实现AngularJS方法扩展的主要方式之一
模块化与依赖注入的异同:
(关于前端模块化可以看《前端模块化的那些事儿》)
type | common | differentia |
---|---|---|
模块化 | 解决不同层面之间的调用关系 | 调用者主动查找被调用者 |
依赖注入 | 解决不同层面之间的调用关系 | 被调用者声明主动声明,注入到调用者内部 |
在什么地方使用依赖注入?
依赖注入一般都是使用在纯粹表示功能的地方
一般一些表示功能的api我们都可以提取出来,变成全局,所有AngularJS控制器都可以使用功能模块
方法复用——面向切面编程
AngularJS的依赖注入的方式
声明angularjs管理模块
var app = angular.module('app',[])
依赖注入的几种方式
使用.value() 前置声明,主要用于定义一些变量
//可以是值或函数
app.value('MyValue', 'Hello world');
app.value('MyFunc', function() { return 'Samuel say hello to you!' });
app.controller('mycontroller', function($scope, MyValue, MyFunc) {
console.log( MyValue );
MyFunc();
});
使用.constant() 前置声明,它与.value()方法相同,主要是实现一些值的定义,但.constant()是静态变量的声明
app.constant('MyName', 'Samuel');//以第一次的赋值为主
app.constant('MyName', 'Sammuueell');
app.constroller('mycontroller', function( $scope, MyName ) {
console.log( MyName );//Samuel
});
工厂模式.factory(),这是插件形式的扩展
app.factory('MyFactory', function() {
return {
showName: function() { console.log( 'Samuel' ) },
showAge: function() { console.log( 25 ) }
}
});
app.controller('mycontrollre', function( $scope, MyFactory ) {
MyFactory.showName();
MyFactory.showAge();
});
用.service()注入方法,这是以服务提供的方式实现扩展
app.service('MyService', function() {
this.setService = functioin() { }
});
app.controller('mycontroller', function( $scope, MyService ) {
console.log( MyService );
});
PS:与工厂模式的区别:.service相当于在底层直接通过new操作符创建了一个实例,而工厂模式需要通过返回对象的方式来调用
以上就是通过依赖注入给AngularJS进行扩展的基本方式,嚯嚯嚯~
那几眼哪儿去了?
第一眼——AngularJS
第三眼——AngularJS路由