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 相关文章推荐
javascript获取重复次数最多的字符
Jul 08 Javascript
js实现内容显示并使用json传输数据
Mar 16 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
Javascript基础回顾之(一) 类型
Jan 31 Javascript
用vue和node写的简易购物车实现
Apr 25 Javascript
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
JavaScript实现滑动导航栏效果
Aug 30 Javascript
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
JS实现的点击按钮图片上下滚动效果示例
Jan 28 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
详解Vue的mixin策略
Nov 19 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
基于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
php中显示数组与对象的实现代码
2011/04/18 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
python读写文件操作示例程序
2013/12/02 Python
python中引用与复制用法实例分析
2015/06/04 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
简约控的天堂:The Undone
2016/12/21 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
董事长秘书岗位职责
2013/11/29 职场文书
公司年会策划方案
2014/05/17 职场文书
校庆活动策划方案
2014/06/05 职场文书
法学求职信
2014/06/22 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
2019各种保证书范文
2019/06/24 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Python如何使用循环结构和分支结构
2022/04/13 Python