AngularJS之自定义服务详解(factory、service、provider)


Posted in Javascript onApril 14, 2017

前言

1、3种创建自定义服务的方式。

  1. Factory
  2. Service
  3. Provider

2、大家应该知道,AngularJS是后台人员在工作之余发明的,他主要应用了后台早就存在的分层思想。所以我们得了解下分层的作用,如果你是前端人员不了解什么是分层,那么你最好问问你后台的小伙伴。

dao层:就是Model层,在后台时,这一层的作用,就要是写与数据库交互数据的一层,在angularJS里就主要是写ajax的。

service层:主查写逻辑代码的,但在angularJS里也可以持久化数据(充当数据容器),以供不同的controller高用。

controller层:即控制层,在angularJS里就是写控制器的。控制器里尽量不要写那些不必要的逻辑,尽量写在service层里。
所以,就有了创建自定义服务的三种方式。

factory

factory方式创建的服务,作用就是返回一个有属性有方法的对象。相当于:var f = myFactory();

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
  <p>{{r}}</p>
</div>

<script>
  //创建模型
  var app = angular.module('myApp', []);

  //通过工厂模式创建自定义服务
  app.factory('myFactory', function() {
    var service = {};//定义一个Object对象'
    service.name = "张三";
    var age;//定义一个私有化的变量
    //对私有属性写getter和setter方法
    service.setAge = function(newAge){
      age = newAge;
    }
    service.getAge = function(){
      return age; 
    }
    return service;//返回这个Object对象
  });
  //创建控制器
  app.controller('myCtrl', function($scope, myFactory) {
    myFactory.setAge(20);
    $scope.r =myFactory.getAge();
    alert(myFactory.name);
  });
</script>
</body>
</html>

在自定义服务里注入服务示例,但不能注入$scope作用域对象。

<script>
  var app = angular.module('myApp', []);
  app.factory('myFactory', function($http,$q) {
    var service = {};
    service.name = "张三";
    //请求数据
    service.getData = function(){
      var d = $q.defer();
      $http.get("url")//读取数据的函数。
      .success(function(response) {
        d.resolve(response);
      })
      .error(function(){
        d.reject("error");
      });
      return d.promise;
    }    
    return service;
  });
  app.controller('myCtrl', function($scope, myFactory) {
    //alert(myFactory.name);
    myFactory.getData().then(function(data){
      console.log(data);//正确时走这儿
    },function(data){
      alert(data)//错误时走这儿
    });;
  });
</script>

service

通过service方式创建自定义服务,相当于new的一个对象:var s = new myService();,只要把属性和方法添加到this上才可以在controller里调用。

<div ng-app="myApp" ng-controller="myCtrl">
  <h1>{{r}}</h1>
</div>
<script>
  var app = angular.module('myApp', []);

  app.service('myService', function($http,$q) {
    this.name = "service";
    this.myFunc = function (x) {
      return x.toString(16);//转16进制
    }
    this.getData = function(){
      var d = $q.defer();
      $http.get("ursl")//读取数据的函数。
        .success(function(response) {
        d.resolve(response);
      })
        .error(function(){
        alert(0)
        d.reject("error");
      });
      return d.promise;
    }
  });
  app.controller('myCtrl', function($scope, myService) {
    $scope.r = myService.myFunc(255);
    myService.getData().then(function(data){
      console.log(data);//正确时走这儿
    },function(data){
      alert(data)//错误时走这儿
    });
  });
</script>

3.provder

只有provder是能传 .config() 函数的 service。如果想在 service 对象启用之前,先进行模块范围的配置,那就应该选择 provider。需要注意的是:在config函数里注入provider时,名字应该是:providerName+Provider.
使用Provider的优点就是,你可以在Provider对象传递到应用程序的其他部分之前在app.config函数中对其进行修改。

当你使用Provider创建一个service时,唯一的可以在你的控制器中访问的属性和方法是通过$get()函数返回内容。

<body>
<div ng-app="myApp" ng-controller="myCtrl">
</div>

<script>
  var app = angular.module('myApp', []);

  //需要注意的是:在注入provider时,名字应该是:providerName+Provider  
  app.config(function(myProviderProvider){
    myProviderProvider.setName("大圣");    
  });
  app.provider('myProvider', function() {
    var name="";
    var test={"a":1,"b":2};
    //注意的是,setter方法必须是(set+变量首字母大写)格式
    this.setName = function(newName){
      name = newName 
    }

    this.$get =function($http,$q){
      return {
        getData : function(){
          var d = $q.defer();
          $http.get("url")//读取数据的函数。
            .success(function(response) {
              d.resolve(response);
            })
            .error(function(){
              d.reject("error");
            });
          return d.promise;
        },
        "lastName":name,
        "test":test
      }  
    }

  });
  app.controller('myCtrl', function($scope,myProvider) {
    alert(myProvider.lastName);
    alert(myProvider.test.a)
    myProvider.getData().then(function(data){
      //alert(data)
    },function(data){
      //alert(data)
    });
  });
</script>
</body>

4.在过滤器中注入自定义服务

<body>
<div ng-app="myApp">
  在过滤器中使用服务:
  <h1>{{255 | myFormat}}</h1>
</div>

<script>
  var app = angular.module('myApp', []);
  app.service('hexafy', function() {
    this.myFunc = function (x) {
      return x.toString(16);
    }
  });
  app.filter('myFormat',['hexafy', function(hexafy) {
    return function(x) {
      return hexafy.myFunc(x);
    };
  }]);
</script>
</body>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
利用js对象弹出一个层
Mar 26 Javascript
JS实现往下不断流动网页背景的方法
Feb 27 Javascript
JavaScript中调用函数的4种方式代码实例
Jul 08 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 Javascript
jQuery回调方法使用示例
Jun 26 jQuery
微信小程序多列选择器range-key使用详解
Mar 30 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
深入浅析Vue 中 ref 的使用
Apr 29 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 #Javascript
vue组件中点击按钮后修改输入框的状态实例代码
Apr 14 #Javascript
angularjs实现首页轮播图效果
Apr 14 #Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 #Javascript
微信小程序 下拉菜单简单实例
Apr 13 #Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 #Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 #Javascript
You might like
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python学生管理系统代码实现
2020/04/05 Python
eclipse创建python项目步骤详解
2019/05/10 Python
Django CBV类的用法详解
2019/07/26 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
Python @property及getter setter原理详解
2020/03/31 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
医药代表个人的求职信分享
2013/12/08 职场文书
列车长先进事迹材料
2014/01/25 职场文书
经典婚礼主持词
2014/03/13 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
班主任对学生的评语
2014/04/26 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
2015年安全工作总结范文
2015/04/02 职场文书