angularJS学习小结——service

简介: angularJS学习小结——service

引言


最近在项目中用到了关于angularJS中的服务相关的知识,在起初学习这个东西的时候就了解到这个东西在项目中是经常被用到的,在angular中也是比较重要的一块,所以今天小编就总结一些关于service的知识。


认识Service


关于service我们一点都不陌生,不论实在c#中还是java中我们经常会遇到service的概念,其实service的作用就是对外提供某种特定的功能,也就是我们经常说的“为了实现某个功能而调用哪个服务”是一样的道理,他们一般是一个独立的模块,ng服务是这样的定义的:


Angular services are singletons objects or functions that carry out specific tasks common to web apps.


  1、它是一个单利对象或函数,对外提供特定的功能。


  2、它与我们自己定义一个function然后在其他地方调用不同,因为服务被定义在一个模块中,所以它的作用范围是可以被我们来管理的,ng避免全局变量污染意识是非常强的。


自定义服务


在angular中为我们提供了三种不同的方式来实现自定义服务,他们分别是系统内置的$provider、module中的service和module中的factory,下面来看看如何使用这三种方式;


  1)$provide的使用


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

 var m1 = angular.module('myApp', [], function ($provide) {
        $provide.provider('providerService01', function () {
            this.$get = function () {
                return {
                    message: 'this is providerService01'
                }
            }
        })
        $provide.provider('providerService02', function () {
            this.$get = function () {
                var _name = '';
                var service = {};
                service.setName = function (name) {
                    _name = name;
                }
                service.getName = function () {
                    return _name
                }
                return service;
            }
        })
    })
    m1.controller('firstController', ['$scope', 'providerService01', 'providerService02', function ($scope, providerService01, providerService02) {
        console.log(providerService01);
        providerService02.setName("李四");
        $scope.name = providerService02.getName();
    }])

我们在使用$provide的使用可以像上面这样直接在module中直接注入$provide,然后再module中依次定义多个服务,当然我们也可以利用config来完成服务的定义。

var m1=angular.module('myApp',[]);
m1.config(function($provide){
    $provide.provider('providerService01', function () {
        this.$get = function () {
            return {
                message: 'this is providerService011'
            }
        }
    });
    $provide.provider('providerService02', function () {
        this.$get = function () {
            var _name='';
            var service={};
            service.setName=function(name){
                _name=name;
            }
            service.getName=function(){
                return _name
            }
            return service;
        }
    });
})

上面这两种实现方式达到的效果是一样的,所以我们在使用的时候可以任意选择一种来实现。


2)factory的使用


Factory方法直接把一个函数当成一个对象的$get 方法可以直接返回字符串,用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。  

var m1 = angular.module('myApp', [], function ($provide) {
    $provide.factory('factoryService01',function(){
        return{
            message:'this is providerServices01'
        }
    })
});

factory的使用比$provide的使用简单一些,可以在factory直接返回已给对象,不在使用$get来实现对象的返回。并且$factory和$provide不仅仅可以返回一个对象还可以返回一个任意的字符串。


3)service的使用


Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在 controller 里 "this" 上的属性 就可以通过 service 来使用了    

$provide.service('service01',function(){
        return{
            message:'this is providerServices01'
        }
    })


service和factory的使用是非常相似的,但是service是不能返回字符串的,而factory既可以返回对象也可以返回任意的字符串。


三者的区别:provider需要借助$get来实现,而其余的两者都不需要。series不能返回字符串,而其他的两个都可以返回。


服务之间的依赖关系


我们在实现某个功能的时候也许需要多个服务相互依赖才可以完成,那么对于服务之间的关系我们就需要来管理,例如我们在完成一个数据验证的功能,这是在jsFiddle中找的一个非常简单的小例子

var app = angular.module('MyApp', []);
app.controller('testC3',function($scope,validate){
    $scope.validateData = validate;
});
app.factory('remoteData',function(){
    var data = {name:'n',value:'v'};
    return data;
});
app.factory('validate',function(remoteData){
    return function(){
        if(remoteData.name=='n'){
            alert('验证通过');
        }
    };
});

服务validate是来验证数据是否合法的功能,但是它需要依赖另外一个服务remoteData来获得数据,但是在factory的参数中,我们可以直接传入服务remoteData,ng的依赖注入机制便帮我们做好了其他工作。不过一定要保证这个参数的名称与服务名称一致,ng是根据名称来识别的。若参数的名次与服务名称不一致,你就必须显示的声明一下,方式如下:


app.factory('validate',['remoteData',function(remoteDataService){
    return function(){
        if(remoteDataService.name=='n'){
            alert('验证通过');
        }
    };
}]);


小结


以上是小编在学习angularJS服务的一些总结,这些都是入门的知识,在这和大家分享一下,如果想要对服务有更深层的理解还需要我们在项目中好好的研究。

目录
相关文章
|
移动开发 NoSQL 网络协议
掌握GDB调试工具,轻松排除bug(下)
掌握GDB调试工具,轻松排除bug
|
JSON 数据处理 数据安全/隐私保护
【C/C++ 数据传输结构设计】GET与SEND的设计与实践
【C/C++ 数据传输结构设计】GET与SEND的设计与实践
162 0
【优化篇】使用Keepalived实现简单的GrayLog高可用
【优化篇】使用Keepalived实现简单的GrayLog高可用
148 0
|
Oracle 关系型数据库 Linux
解决VMmare虚拟机安装过程没有权限问题
解决VMmare虚拟机安装过程没有权限问题
381 0
|
SQL 数据管理 关系型数据库
数据管理DMS操作报错合集之同步时一直报错:SQLException: No operations allowed after statement closed。该怎么解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
486 3
uniCloud 的 schema2code 【实用教程】
uniCloud 的 schema2code 【实用教程】
229 0
|
缓存 算法 Java
JAVA性能优化与调优
本文介绍了Java性能优化与调优的重要性,强调了选择合适的数据结构和算法、减少对象创建与销毁、利用多线程并发处理等方法。示例代码展示了如何在不同场景下优化性能,如使用HashMap代替ArrayList提高查找效率,以及通过线程池和CountDownLatch实现并发任务。此外,文中还提到其他优化技巧,如JVM参数调优、缓存使用、避免不必要的异常处理和选择高效IO操作。性能优化是一个持续过程,需结合具体需求进行实践。
|
存储 编译器 C语言
【C++入门到精通】C++入门 —— 类和对象(了解类和对象)(二)
【C++入门到精通】C++入门 —— 类和对象(了解类和对象)
105 0
|
SQL Go 数据库
Go语言之GORM框架(二) ——GORM的单表操作
Go语言之GORM框架(二) ——GORM的单表操作
136 0
|
并行计算 安全 算法
Java并发编程:线程安全与性能优化
【4月更文挑战第23天】在Java开发中,并发编程是一项重要的技能。通过多线程技术,可以提高程序的性能和响应速度。然而,多线程环境下的线程安全问题和性能优化是开发者需要面对的挑战。本文将介绍Java并发编程的基本概念,以及如何实现线程安全和性能优化。
57 0