AngularJS服务service用法总结


Posted in Javascript onDecember 13, 2016

本文实例总结了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服务的一些总结,这些都是入门的知识,在这和大家分享一下,如果想要对服务有更深层的理解还需要我们在项目中好好的研究。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
[原创]图片分页查看
Aug 28 Javascript
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
Nov 30 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
Dec 24 Javascript
jQuery实现元素的插入
Feb 27 Javascript
Vue获取DOM元素样式和样式更改示例
Mar 07 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 Javascript
javascript实现拼图游戏
Jan 29 Javascript
Vue.js中用v-bind绑定class的注意事项
Dec 13 #Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 #Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 #Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 #Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 #Javascript
浅析Jquery操作select
Dec 13 #Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 #Javascript
You might like
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
python处理json数据中的中文
2014/03/06 Python
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
为什么称python为胶水语言
2020/06/16 Python
Python字典实现伪切片功能
2020/10/28 Python
印刷技术专业自荐信
2014/09/18 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书