对AngularJs中依赖注入的理解和使用方法
Angular中的依赖注入一:什么是依赖注入?
<div ng-app="mainApp" ng-controller="CalcController">
.........
</div>
<script type="text/javascript"> // 定义一个模块 var mainApp = angular.module("mainApp",[]); // 创建 value 对象 "defaultInput" 并传递数据 mainApp.value("defaultInput",5); // 将 "defaultInput" 注入到控制器 mainApp.controller('CalcController',function($scope,defaultInput) { $scope.number = defaultInput; console.log(defaultInput) }); </script>
//4.factory 是一个函数用于返回值。在 service 和 controller 需要时创建。通常我们使用 factory 函数来计算或返回值。
mainApp.factory('MathService',function() {
var factory = {};
factory.multiply = function(a,b) {
return a * b
}
return factory;
});
Angular里面创建服务的一个方式是使用factory()方法,factory()让我们通过返回一个包含服务方法和数据的对象来定义一个服务。在创建的服务方法里我们可以注入其他服务,比如&http; angular.module('myApp.services').factory('User',function($http) {
var backendUrl = "http://localhost:3000";
var service = {
user: {},setName: function(newName) {
service.user['name'] = newName;
},setEmail: function(newEmail) {
service.user['email'] = newEmail;
},save: function() {
return $http.post(backendUrl + '/users',{
user: service.user
});
}
};
return service;
});
app.service('hexafy',function() {
this.myFunc = function (x) {
return x.toString(16);
}
});
app.controller('myCtrl',function($scope,hexafy) {
$scope.hex = hexafy.myFunc(255);
});
// 使用 provider 创建一个 MathService服务,用于定义一个方法用于计算两数乘积
mainApp.config(function($provide) {
$provide.provider('MathService',function() {
this.$get = function() {
var obj= {};
obj.multiply = function(a,b) {
return a * b;
}
return obj;
};
});
});
如果不理解,请耐心往下看: angular.module('myApp').factory('myService',function(){
var obj = {'username' : 'bangbang'};
return obj;
})
这与上面工厂的用法等价 angular.module('myApp').provider('myService',{
$get : function(){
var obj = {'username' : 'bangbang'};
return obj;
}
})
是否可以一直使用factory()方法来代替provider()呢? var app = angular.module('myApp',[]);
//使用provider注册该服务
app.provider('githubService',function(){
//默认的,私有状态
var githubUrl = 'https://github.com';
return {
setGithubUrl : function(url){
//通过.config改变默认属性
if(url){
githubUrl = url;
}
},$get : function($http){
self = this;
return $http({method : 'get',url:'datas.json'});
}
}
})
app.controller('myCtrl',githubService){
console.log(githubService)
})
??通过使用provider()方法,可以在多个应用使用同一个服务时候获得更强的扩展,特别是在不同应用或开源社区之间共享服务时。 angular.modele('myApp',[]).config(function(gitbubServiceProvider){
githubServiceProvider.setGithubUrl("git@github.com");
})
如果希望在config()函数中可以对服务进行配置,必须用provider()来定义服务。
//在模块对象上直接创建provider的例子
var app = angular.module('myApp',[]);
app.provider("myService",{
favoriteColor : null,setFavoriteColor : function(newColor){
this.favoriteColor = newColor;
},//$get函数可以接受injectables
$get : function($http){
return{
'name' : 'bangbang',getFavoriteColor : function(){
return this.favoriteColor || 'unknown';
}
}
}
})
app.controller('myCtrl',myService){
console.log(myService)
myService.getFavoriteColor('white');
})
用这个方法创建服务,必须返回一个定义有$get()函数的对象,否则会导致错误。provider()是非常强大的,可以让我们在不同的应用中共享服务。
var app = angular.module('myApp',[]);
app.constant('names',['bangbang','qiqi','niuniu']).controller('myCtrl',names){
console.log(names); //["bangbang","qiqi","niuniu"]
})
var app = angular.module('myApp',[]);
app.constant('number','22').config(function(number){
//在这里number将被赋值为22
console.log(number)
}).value('name','bangbang').config(function(name){
console.log(name); //这将抛出一个错误,因为,在config()函数内部无法访问这个值
})
参考文章和书籍:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |