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 图片上传预览-兼容标准
Jun 01 Javascript
Js 弹出框口并返回值的两种常用方法
Dec 30 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
JQuery复制DOM节点的方法
Jun 11 Javascript
C#中使用迭代器处理等待任务
Jul 13 Javascript
JavaScript中的return语句简单介绍
Dec 07 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 06 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
多个Vue项目部署到服务器的步骤记录
Oct 22 Javascript
如何用JavaScipt测网速
May 09 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-fpm 参数的深入理解
2013/06/03 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
如何防止回车(enter)键提交表单
2014/05/11 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
详解Python中的文件操作
2021/01/14 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
猫咪家具:CatsPlay
2018/11/03 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
感恩教师节演讲稿
2014/09/03 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
政协常委会议主持词
2015/07/03 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript