AngularJS 之 Factory,Service,Provider

依赖注入的优点

  • 各模块之间的解耦,每个部分专注于自己的功能,对象的注入通过容器来完成
  • 避免全局对象的污染

Provider

// 语法糖
app.provider('myProvider', function () {
    this.$get = function () {
    };
});

唯一一种你可以传进 .config()函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider

app.provider('myProvider', function () {
	.config(function ($stateProvider, $couchPotatoProvider) {
        .state 'complaint',
	        parent: 'base'
	        url: '/build/complaint'
	        templateUrl: '/build/modules/complaint/index.html'
	        controller: complaintCtrl'
	        resolve:
	          l: $couchPotatoProvider.resolveDependencies(['modules/complaint/controllers/complaintCtrl'])
    })
    this.$get = function ($q, restService, $rootScope, $state, $timeout) {
    	provider = {}
        rvm = $rootScope
        function initComplaintMenu() {
        	var defered = $q.defer();
        	var promise = defer.promise;
        }
		
		rvm.$on('menu:init', function(event, user) {
	      initComplaintMenu().then(function(data) {
	        if (data.isEnabled) {
	          rvm.$broadcast('menu:add', { name: data.name, state: 'complaint', index: 6 })
	          $timeout(function(){
	            if ($state.current.name === 'detail') {
	              $('.navbar-menus a[ui-sref="complaint"]').addClass('active')
	            }
	          }, 0)
	        }
	      })
	    })
    };
});

Factory
当使用factory来创建服务的时候,相当于新创建了一个对象,然后在这个对象上新添属性,最后返回这个对象。当把这个服务注入控制器的时候,控制器就可以访问在那个对象上的属性了。
语法糖

app.factory('myFactory', function ($http) {
   var factory = {};
    return factory;
 });

通过factory方法创建的服务必须有返回值

app.controller('myCtrl', ['$scope', 'myFactory', function ($scope, myFactory) {
     console.log(myFactory.getName());  
     myFactory.getData('./test.html').then(function (response) {
         console.log(response);  
     });
 }]);
 app.factory('myFactory', function ($http) {
     var factory = {};
     var _name = 'foo';
     factory.getData = function (url) {
         return $http({
             method: 'get',
             url: url
         });
     };
     factory.getName = function () {
         return _name;
     };
     return factory;
 });

Service
service 类似于一个构造器, 通过 new 关键字实例化对象,将一些属性和方法直接添加到 this 上,在创建 service 对象时,this 会被作为返回值返回。
语法糖

app.service('myService', function () {
 });

三种方法的比较

  • 需要在config中进行全局配置的话,只能选择provider方法
  • factory和service是使用比较频繁的创建服务的方法。他们之间的唯一区别是:service方法用于注入的结果通常是new出来的对象,factory方法注入的结果通常是一系列的functions
  • provider是创建服务最为复杂的方法,除非你需要创建一个可以复用的代码段并且需要进行全局配置,才需要使用provider创建
  • 所有具有特定性目的的对象都是通过factory方法去创建
特性FactoryServiceProvider
是否可以依赖注入
是否依赖注入友好
是否可在config中进行配置
是否可以创建函数
是否可以创建基本数据类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值