详解Angular中的自定义服务Service、Provider以及Factory


Posted in Javascript onApril 22, 2017

背景来源于前段时间的一场面试,面试官看着我Angular控制器中添加各种功能重复的方法,脸都发绿了,不过还是耐心地跟我指出提高Angular代码复用性需要Service、Provider和Factory三种复用性很高的方法,遂习之,以下是我的学习成果:

先说说Factory:

通过注册.factory('my注册名',方法()),返回一个对象,你就能在控制器中引入这个方法并访问这个对象:
例子:

<!-- factory模式 -->
  <div ng-controller="theFactoryCtrl">
    <h3>Factory模式</h3>
    <ul>
      <li ng-repeat="i in names">
        {{i}}
      </li>
    </ul>

  </div>

JS代码:

/*工厂模式,注入参数中调用的是这个函数里的返回值*/
  app.factory("myFactory",function(){

    var args = arguments;
    var obj = {}

    obj.exec = function(){
      var arr = [];
      for(let i = 0; i<arguments.length; i++){
        arr.push(arguments[i]);
      }
      return arr;
    }
    return obj;
  })
app.controller("theFactoryCtrl",function ($scope,myFactory) {

    $scope.names = myFactory.exec("张三的歌","赵四的舞","老王贼六");

  })

效果:

详解Angular中的自定义服务Service、Provider以及Factory

Service:

在service使用构造函数的方法去用它,在控制器中是以new的方式引入,所以可以调用service中定义的属性

HTML:

<!-- service模式 -->
  <div ng-controller="theServiceCtrl">
    <h3>Service模式</h3>
    <p>prop:{{prop}}</p>
    <p>num:{{num}}</p>
  </div>

JS:

app.controller("theServiceCtrl",function($scope,myService){
    $scope.prop = myService.prop("呵呵");
    $scope.num = myService.num;
  })
/*Service是new出来的,所以可以直接调用里面的属性*/
  app.service("myService",function(){
    this.num = Math.floor(Math.random()*10);//0到10的随机数
    this.prop = function(arg){
      return arg;
    };
  })

效果:

详解Angular中的自定义服务Service、Provider以及Factory

Provider:

如果你想在创建服务之前先对服务进行配置,那么你需要provider,因为provider可以通过定义config,并在$get中访问config
HTML:

<!-- provider模式 -->
  <div ng-controller="theProviderCtrl">
    <h3>Provider模式</h3>
    <p>姓名:{{info.name}}</p>
    <p>部队:{{info.squad}}</p>
    <p>职务:{{info.role}}</p>
  </div>

JS:

/*使用$get方法关联对应的config*/
  app.provider("myProvider",function(){

    this.$get = function(){

      return {
        name : "朱子明",
        squad : "八路军386旅独立团",
        role : this.roleSet

      }
    }

  })
  /*名字必须符合规范:xxxxxxProvider*/
  app.config(function(myProviderProvider){
    myProviderProvider.roleSet = "保卫干事"
  })
app.controller("theProviderCtrl",function($scope,myProvider){
    $scope.info = {
      name : myProvider.name,
      squad : myProvider.squad,
      role : myProvider.role

    }
  })

效果:

详解Angular中的自定义服务Service、Provider以及Factory

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

Javascript 相关文章推荐
Javascript中的Split使用方法与技巧
Mar 09 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
May 03 Javascript
JavaScript中OnLoad几种使用方法
Dec 15 Javascript
IE8下String的Trim()方法失效的解决方法
Nov 08 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
jQuery实现连续动画效果实例分析
Oct 09 Javascript
Mongoose经常返回e11000 error的原因分析
Mar 29 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
d3.js实现图形拖拽
Dec 19 Javascript
vue+element实现动态加载表单
Dec 13 Vue.js
Ionic2调用本地SQlite实例
Apr 22 #Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 #Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 #Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 #Javascript
AngularJS的脏检查深入分析
Apr 22 #Javascript
在node中如何使用 ES6
Apr 22 #Javascript
JS实现异步上传压缩图片
Apr 22 #Javascript
You might like
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python中类的继承代码实例
2014/10/28 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
python 绘制国旗的示例
2020/09/27 Python
python中最小二乘法详细讲解
2021/02/19 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
大学生个人求职信例文
2014/07/07 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技