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 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
button没写type=button会导致点击时提交
Mar 06 Javascript
Js实现手机发送验证码时按钮延迟操作
Jun 20 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
浅谈vue的踩坑路
Aug 31 Javascript
swiper动态改变滑动内容的实现方法
Jan 17 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
Mar 02 Javascript
Vue写一个简单的倒计时按钮功能
Apr 20 Javascript
Javascript读取上传文件内容/类型/字节数
Apr 30 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 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
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
在Python的Django框架中创建语言文件
2015/07/27 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python实战之制作天气查询软件
2019/05/14 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
巴西购物网站:Estrela10
2018/12/13 全球购物
医疗器械售后服务承诺书
2014/05/21 职场文书
公司应聘求职信
2014/06/21 职场文书
语文教研活动总结
2014/07/02 职场文书
给老师的感谢信
2015/01/20 职场文书
高中政治教师教学反思
2016/02/23 职场文书
Python django中如何使用restful框架
2021/06/23 Python
Redis分布式锁的7种实现
2022/04/01 Redis