angularjs-服务

1.服务提供能够在应用的整个生命周期保持数据的方法,
它能在控制器之间通信,且能保持数据的一致性。

首先工厂服务,属于服务的一种:
可以在其中设置get,set方法,就像返回一个对象一般。
声明方法为:

app.factory('UserService', function ($http) {
    var currentUser = {};//保存当前用户数据
    return {
        getCurrentUser: function () {
            return currentUser;
        },
        setCurrentUser: function (user) {
            currentUser = user;
        }
    }
});

其他控制器使用此方法时,需要在声明时注入UserService

2.第二节介绍常量与变量:

app.constant('apiKey','123123123');//常量的声明
app.value('apiKey2','123123123');//变量的声明

常量与变量都可以在控制器中得以使用,但是两者唯一的区别是,常量可以在app.config配置函数中使用,变量则不行。

3.接下来是介绍service服务的声明和使用
声明方式:

app.service('UserService', function () {
    var currentUser;
    this.getCurrentUser = function () {
        return currentUser;
    };
    this.setCurrentUser = function (user) {
        currentUser = user;
    }
});

服务 service(name,constructor) 它和factory等同效果。

4.provider
提供者 provider(name,{get:function(){…..}})  
当传入的函数就是
get时,factory就是provider的简化形式
可以使用config()方法对provider进行配置

app.provider('MyUserService',{
    //默认url
    url:'users.json',
    //添加setUrl方法提供修改url的方法
    setUrl: function (newUrl) {
        this.url = newUrl;
    },
    $get: function ($http) {//可以在此处注入其他服务
        var currentUser={};
        var self = this;//将外层引用保存下来
        return {
            getCurrentUser:function() {
                //通过$http请求数据
                return $http.get(self.url);
            },
            setCurrentUser:function(user) {
                currentUser = user;
            }
        }
    }
});

app.config(function (MyUserServiceProvider) {
    //此例为修改provider中的Url
    MyUserServiceProvider.setUrl('data/users.json');
});

5.包装器
在app.config中使用包装器,对provider进行包装:

app.provider('MyUserService',{
    //默认url
    url:'users.json',
    //添加setUrl方法提供修改url的方法
    setUrl: function (newUrl) {
        this.url = newUrl;
    },
    $get: function ($http) {//可以在此处注入其他服务
        var currentUser={};
        var self = this;//将外层引用保存下来
        return {
            getCurrentUser:function() {
                //通过$http请求数据
                return $http.get(self.url);
            },
            setCurrentUser:function(user) {
                currentUser = user;
            }
        }
    }
});
//包装之后就可以在config中对原有方法进行修改增加,而不影响原有代码
//此处要对MyUserService进行包装,因此我们在config函数中注入$provide
app.config(function ($provide,MyUserServiceProvider) {
    MyUserServiceProvider.setUrl('data/users.json');

    //对MyUserService包装,第一个参数指定为拦截服务的名称
    //此处需要在构造函数中注入$delegate
    //因为需要输出控制台信息,所以注入$log
    $provide.decorator('MyUserService', function ($delegate,$log) {
        return {
            getCurrentUser: function () {
                //执行所拦截服务之前的方法
                var p = $delegate.getCurrentUser();
                //额外做些事情:记录一下该次请求所消耗时间
                //首先记录请求发起时间
                var startAt = new Date();
                p.finally(function () {
                    $log.info('消耗时间:'+(new Date()-startAt)+'毫秒')
                });
                return p;
            }
        }
    })
});

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值