这两年做前端开发,对JS的学习还在不断,JS的发展还是很快的。下面来看看一个AngularJS库。

服务是AngularJS中非常重要的一个概念,虽然我们有了控制器,但考虑到其生命实在脆弱,我们需要用到服务。

起初用service时,我便把servicefactory()理所当然地关联起来了。
确实,factory()是创建一个服务的最简单的方式,但服务并非仅此而已。

这里记录一下我对服务的一些简单认识。

Service

非常重要的一点 —— 服务是单例
一个服务在一个AngularJS应用中只会被$injector实例化一次,并贯穿应用的整个生命周期,与脆弱的控制器们进行通信。

先从注册一个服务开始,注册服务的最常见方式便是factory()
比如:

var myApp = angular.module('myApp',[])
.factory('myService',function() {return {};
});

factory()以对象或者函数形式返回一个服务。
我们试试给myService注入$http服务,写一个像那么回事的东西。

(ps:找了一些URL都不是很理想,我也只好学别人的demo,从github获取用户的活动日志信息)

注入? 把服务注入给控制器也是这样,把服务的名字放到参数列表里就算是注入了,但这只是简单的方式。

好了,先把myService修改一下:

.factory('myService',function($http) {return {getUserActivities: function(username){return $http({method: 'JSONP',url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'});}};
})

根据输入的用户名进行请求,输出活动信息,视图如下:

<div ng-controller="myController"><input type="text" ng-model="username" /><table border="1"><tr><th></th><th>user</th><th>to</th><th>at</th></tr><tr ng-repeat="activity in activities"><td><img src="{{activity.actor.avatar_url}}" width="25px" height="25px"/></td><td>{{ activity.actor.login }} </td><td>{{ activity.repo.name }}</td><td>{{activity.created_at}}</td></tr></table>
</div>

我们需要$watch这个变量,但需要注意的是,如果请求频率超过限制,github会给个403。
因此还需要用$timeout控制一下请求频率,一段时间之内重复请求就把之前的干掉。
控制器调用服务代码如下:

.controller('myController',function($scope,myService,$timeout,$log){var timeout;$scope.$watch('username',function(){if(timeout){$timeout.cancel(timeout)$log.info('timeout:::'+timeout);}               timeout= $timeout(function(){myService.getUserActivities($scope.username).success(function(response, status, headers, config){$scope.activities = response.data;}).error(function(response, status, headers, config){$log.info(status)})},1000);});
})

javascript教程 http://www.17javascript.com/

factory()注册一个服务似乎不那么复杂。
事实上,我们有5种方式来创建服务:

  • factory
  • service
  • constant
  • value
  • provider

factory

最简单的方式,该函数接收2个参数

  • name (string):服务名
  • getFn (function/array):AngularJS实例化服务时调用该函数

service

可能是因为更加语义化的缘故,比起factory(),我更喜欢service()
service也同样接收2个参数,分别是:

  • name (string):服务名
  • constructor (function):服务对象的构造函数

试着改用service():

.service('myService',function($http) {this.getUserActivities = function(username){return $http({method: 'JSONP',url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'});}
})

constant与value

这两个名字感觉比较另类,它们的参数都是一样的:

  • name
  • value

仅从语义上来讲,如果服务的$get方法只是返回个常量,这两个方法确实适合。
可能会尝试写个函数进去,如果只是定义的话则不会报错。
但不会有相应的provider,调用时也会提示该服务不是一个函数之类的问题。

所以还是老老实实地这样使用:

.constant('serviceId','00001')

那两者的区别又是什么?
区别在于注入到config()时,以上面的serviceId为例。
如果serviceId是个constant,我们可以将serviceId注入到config()中,但是无法将serviceIdProvider注入到config()中,而value则刚好相反。

provider

provider()是最原始的方法。
我们试着用factory()provider()创建相同的服务进行对比。

.factory('aService',{'name':'a'
})
.provider('bService',{$get: {'name':'b'}
})

也就是说factory()的第二个参数相当于是$get?
provider()接收两个参数:

  • name (string) :仍然是服务实例的名字,如果name+'Provider'便是provider的名字。
  • provider (object/array/function) : 不是服务,是带$get()的provider

$provide服务在运行时初始化provider,$injector调用$get创建服务实例。
那为什么要用provider()而不是其他方式? 关键在于config(),如果我们给多个应用共享某个服务,但在注入服务之前给注入到不同应用的服务进行相应的设置,则需要在config()中通过服务的provider进行设置,比如加个decorator什么的。

decorator

就是装饰服务,添加功能或者完全改变服务。
decorator()接收两个参数

  • name (string):要装饰的服务的名称
  • decoratorFn (function):服务实例化时由$injector调用该函数。

下面是一个例子,在获得用户活动信息后输出耗时:

.config(function(myServiceProvider,$provide){$provide.decorator('myService',function($delegate,$log) {var activities = function(username) {var startedAt = new Date();var activities = $delegate.getUserActivities(username);activities.finally(function() {$log.info("Fetching activities" +" took " +(new Date() - startedAt) + "ms");});return activities;};return {getUserActivities:activities};});
})


前端开发JS的学习之AngularJS库相关推荐

  1. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记

    <疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...

  2. 前端中什么是中台开发环境_Web前端开发中需要学习什么?会使用到哪些开发工具?...

    今天我们来谈谈Web和前端开发过程中需要学习什么?前端开发需要使用什么开发工具?也简单介绍前端开发前景和薪水.下面和千锋广州小编一起来看看吧! ​前端工程师的主要职责: 前端工程师在不同的公司有不同的 ...

  3. Web前端开发基础三剑客学习知识分享

    Web前端开发基础知识学习路线分享,前端开发入门学习三大基础:HTML.CSS.JavaScript.除此之外还要学习数据可视化.Vue.React.Angular相关框架,熟练运用框架提升开发效率, ...

  4. 学习web前端开发,需要学习什么?

    如果要学习web前端开发,需要学习什么? 遇到很多新手,都会问,如果要学习web前端开发,需要学习什么?难不难?多久能入门?怎么能快速建一个网站?工资能拿到多少?还有些让我推荐一些培训机构什么的要去学 ...

  5. 42个面向前端开发人员的很棒JavaScript 库和框架

    英文 | https://javascript.plainenglish.io/42-good-javascript-libraries-and-frameworks-for-front-end-de ...

  6. 小白vue_web前端开发:新手学习前端应该先学vue还是react?

    新手学vue还是react?下面本篇文章给大家分析一下.有一定的参考价值,正在学习或者有需要的朋友可以参考一下,希望对大家有所帮助. 出身背景: react是facebook团队开发,2013.3月发 ...

  7. web前端开发大学生自学学习线路图

    web前端开发由网页制作演变而来,各种丰富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的.前端在飞速发展着.变革着,随之而来就是巨大的企业需求, ...

  8. 前端开发相关的学习网站

    W3.ORG W3.ORG是W3C的官方网站,做前端开发的朋友是一定要经常去看看的.理由我不想多说了,W3.ORG里的官方WEB标准文档如果你都没有认真看过,就不要说你熟悉什么WEB标准.初学者一定要 ...

  9. 小程序开发之【前端开发】【学习第二节】【一】

    学习前必须了解的: 得了解到小程序视图层WXML,WXSS,以及逻辑层JS,这些是小程序开发的核心内容. 小程序框架将整个系统划分为视图层和逻辑层,视图层由框架设计的标签语言(WeiXin Marku ...

最新文章

  1. 尤佳轩、何恺明等提出新型图表示法,新视角理解图结构如何影响预测性能
  2. php 完美分页,php完美分页类程序
  3. jboss性能指标_JBoss BRMS复杂事件处理(CEP)性能基准
  4. StudentManager-java+mysql学生管理系统
  5. api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
  6. Final关键字和类的自动加载
  7. NGUI的输入框的校验(input filed script)
  8. LeetCode-116. 填充每个节点的下一个右侧节点指针
  9. nginx 支持php扩展,Nginx和php安装及配置五之LINUX用PHPIZE安装PHP GD扩展
  10. Javascript模块化编程系列一: 模块化的驱动
  11. 浅谈Java中的栈和堆
  12. 关于伪类:after和content的实际应用
  13. iOS9使用提示框的正确实现方式(UIAlertView is deprecated)
  14. 双随机软件java_随机抽检|双随机一公开 1.0 正式版下载_太平洋下载中心
  15. 京东大数据平台产品体系揭秘
  16. html新年倒计时特效,js实现新年倒计时效果
  17. win10应用商店打不开_为何win10应用商店不能下载itunes
  18. 实战一:给定一段音频,请提取12维MFCC特征,阅读代码预加重、分帧、加窗部分,完善作业代码中fbank和mfcc部分,并给出最终的Fbank和MFCC特征,用默认的配置参数,无需进行修改
  19. 伊利洛伊大学厄巴纳-香槟分校计算机专业,伊利诺伊大学厄巴纳香槟分校哪些专业比较好?...
  20. 影视/动漫 短视频专栏来啦!

热门文章

  1. 在用c语言写代码是这么找出错误,写代码(C语言)常见粗心小错误
  2. linux中按行读取文件,Linux按行读取文件内容
  3. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
  4. 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本
  5. 2020程序员人群洞察报告
  6. python 可视化_Python数据可视化
  7. 专题:区块链与数据共享(下)
  8. 作者:张鹏(1993-),男,国防科学技术大学并行与分布处理重点实验室硕士生...
  9. 作者:孙卫强(1976-),男,博士,上海交通大学教授、博士生导师,主要研究方向为大数据网络、信息通信网等。...
  10. 作者:周晓津(1971-),男,博士,广州市社会科学院研究员。