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操纵Cookie实现购物车程序
Nov 23 Javascript
JavaScript入门学习书籍推荐
Jun 12 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
May 14 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
JS代码实现table数据分页效果
May 26 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
JavaScript队列函数和异步执行详解
Jun 19 Javascript
深入解析ES6中的promise
Nov 08 Javascript
浅谈layui 表单元素的选中问题
Oct 25 Javascript
Node.js创建一个Express服务的方法详解
Jan 06 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
Jan 16 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通用分页类page.php[仿google分页]
2008/08/31 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
html读出文本文件内容
2007/01/22 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
vue实现通讯录功能
2018/07/14 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python获取指定时间差的时间实例详解
2017/04/11 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
大学生自我鉴定评语
2014/01/27 职场文书
陈欧广告词
2014/03/14 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
教师工作证明范本
2015/06/12 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
python实现会员管理系统
2022/03/18 Python
python装饰器代码解析
2022/03/23 Python
2022漫威和DC电影上映作品
2022/04/05 欧美动漫