深究angularJS系列 - 第三弹

深究angularJS系列 - 初识

深究angularJS系列 - 第二弹

深究angularJS系列 - 第三弹,我们一起深入探究angular的服务和自定义指令O(∩_∩)O~~


Angular服务

$http:

  • $http是angular中的一个核心服务;
  • $http利用浏览器的xmlhttprequest或JSONP与远程HTTP服务器进行交互;
  • $http的支持多种method的请求,get、post、put、delete、jsonp等。

下面通过JSONP方法进行$http服务的使用说明,如下:

1 //$http 利用XMLHttpRequest/JSONP
2 var url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=angular&json=1&p=3&sid=1461_21107_17001_21407_21378_21190_20929&req=2&csor=7&pwd=angula&cb=JSON_CALLBACK&_=1477454603449";
3 $http({
4     url:url,
5     method:"JSONP"    //方式有(GET/POST/DELETE/UPDATE/JSONP)等
6 }).success(function(data){ //成功回调
7     console.log(data.s);
8 }).error(function(data){  //错误回调
9 })

Angular服务三种定义方式:

  • provider相当于注入$get定义的函数;
  • factory相当于注入一个方法;
  • service相当于注入一个函数。
 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body ng-controller="oneCtrl">
10     <div>{{ view1 }}</div>
11     <div>{{ view2 }}</div>
12     <div>{{ view3 }}</div>
13 <script src="lib/angular.js"></script>
14 <script>
15     (function(){
16         angular.module("demo",[])
17             .provider("oneProvider",function(){
18                 this.$get = function(){
19                     return "one provider";
20                 }
21             })
22             .factory("oneFactory",function(){
23                 return{
24                     lable: function(){
25                         return "two factory";
26                     }
27                 }
28             })
29             .service("oneService",function(){
30                 this.lable = "three service";
31             })
32             .controller("oneCtrl",function($scope,oneProvider,oneFactory,oneService){
33                 $scope.view1 = oneProvider;
34                 $scope.view2 = oneFactory.lable();
35                 $scope.view3 = oneService.lable;
36             })
37     })()
38 </script>
39 </body>

结果如下:

    

Angular中的$q与Promise

$q解决异步请求的框架;

promise一种编程模式,源于厂商和客户交易的一个故事:

客户对厂商发送了一次延期的请求($q.defer)。

1 var defered = $q.defer();

客户等待有两种结果success(defered.resolve),error(deferred.reject);

1 .success(function(data){
2         defered.resolve(data);
3 }).error(function(data){
4         defered.reject(data);
5 });

厂商当时只能返回给客户的一个承诺 (defered.promise)

1 return defered.promise;

这是一个异步事件,客户等待,厂商则准备商品;
交易中结果  $q.then;
1.厂商,签收,success   事情解决了;
2.厂商,失败,error    事情做不了;
3.厂商,签收,而且服务特别好 notice。

1 oneService.getBaiduList().then(function(success){
2     console.log(success);
3 },function(error){
4
5 },function(notice){
6
7 })

案例如下:

 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body ng-controller="oneCtrl">
10 <script src="lib/angular.js"></script>
11 <script>
12     (function(){
13         angular.module("demo",[])
14             .service("oneService",function($q,$http){
15                 this.getBaiduList = function(){
16                     var url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=angular&json=1&p=3&sid=1461_21107_17001_21407_21378_21190_20929&req=2&cb=JSON_CALLBACK&csor=1&pwd=angula&_=1477454603449";
17                     //为我们的http请求创建一个延期请求
18                     var defered = $q.defer();
19                     $http({
20                         url:url,
21                         method:"JSONP"
22                     }).success(function(data){
23                         defered.resolve(data);
24                     }).error(function(data){
25                         defered.reject(data);
26                     });
27                     return defered.promise;
28                 }
29             })
30             .controller("oneCtrl",function($scope,oneService){
31                 oneService.getBaiduList().then(function(success){
32                     console.log(success);
33                 },function(error){
34                 },function(notice){
35                 })
36             })
37     })()
38 </script>
39 </body>
40 </html>

效果如下:

    

Angular自定义指令

  • Directive(指令,命令),内置的指令 ng-* 放在html标签上的 ng-app  ng-click  ng-controller;
  • Directive(组件) 原生包装过的指令;
  • Directive通过扩展html标签的方式,实现业务的可复用;
  • Directive封装了js,css html,用指令就像用html标签一样简单。

自定义指令创建

 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body>
10 <one></one>
11 <script src="lib/angular.js"></script>
12 <script>
13     (function(){
14         angular.module("demo",[])
15         .directive("one",function(){
16             return { //指令的配置项目
17                 // A:attribute E:element C:class M: 注释
18                 restrict:"E", //用于定义(限制)自定指令在页面上的创建方式
19                 template:"<div class=‘label-danger well‘>hello one</div>", //template内联 //外联 templateUrl
20               replace: false,  //true 默认,覆盖,false:不覆盖
21                 transclude:true
22             }
23         })
24     })()
25 </script>
26 </body>
27 </html>

效果如下:

    

指令间的嵌套

 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body>
10 <one>
11     <two></two>
12 </one>
13 <script src="lib/angular.js"></script>
14 <script>
15     (function(){
16         angular.module("demo",[])
17         .directive("one",function(){
18             return {
19                 restrict:"AE", //AECM区分大小写
20                 template:"<div class=‘well‘ >hello one <div ng-transclude></div></div> ",
21                 replace:false,
22                 transclude:true
23             }
24         })
25         .directive("two",function(){
26             return {
27                 restrict:"AE",
28                 template:"<div class=‘well‘>hello two</div>"
29             }
30         })
31     })()
32 </script>
33 </body>
34 </html>

效果如下:

     

独立作用域的指令

 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body>
10 <hello></hello>
11 <hello></hello>
12 <hello></hello>
13 <hello></hello>
14 <script src="lib/angular.js"></script>
15 <script>
16     (function(){
17         angular.module("demo",[])
18             .directive("hello",function(){
19                 return {
20                     scope:{}, // scope:{} 表示创建一个独立作用域的指令
21                     restrict:"AE",
22                     template:"<div class=‘well‘>" +
23                     "<input type=‘text‘ ng-model=‘txt‘> {{txt}}</div>"
24                 }
25             })
26     })()
27 </script>
28 </body>
29 </html>

效果如下:

    

Link&compile

 1 <!DOCTYPE html>
 2 <html lang="en" ng-app="demo">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>demo</title>
 6     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
 7     <link rel="stylesheet" href="lib/bootstrap.css">
 8 </head>
 9 <body>
10 <hello cm="hi"></hello>
11 <script src="lib/angular.js"></script>
12 <script>
13     (function(){
14         angular.module("demo",[])
15             .directive("hello",function(){
16                 return {
17                     restrict:"AE",
18                     template:"<div class=‘well‘>hello</div>",
19                     //指令解析的最后调用的一个方法
20                     compile:function(){
21                         return {
22                             //渲染到页面
23                             pre:function(scope,element,attr,ctrl){
24                                 console.log("pre-link" + "--" + attr["cm"]);
25                             },
26                             post:function(scope,element,attr,ctrl){
27                                 console.log("post-link"  + "--" + attr["cm"]);
28                             }
29                         }
30                     },
31                     link:function(scope,element,attr,ctrl){
32                         console.log("----link----");
33                     }
34                 }
35             })
36     })()
37 </script>
38 </body>
39 </html>

效果如下:

    

敬请留言指正补充交流!!

(未完待续~~)

时间: 2024-10-25 17:00:01

深究angularJS系列 - 第三弹的相关文章

深究angularJS系列 - 第二弹

深究angularJS系列 - 第二弹,在初步了解了Angular的基础上,进一步的针对Angular的控制器和作用域问题深入探究O(∩_∩)O~~ Angular控制器 控制器(Controller)的理解 控制器是对view的抽象,用来接收view的事件,响应view的请求: 控制器包含view的静态属性和动态的方法: 控制器与view是一对一的关系. 控制器(Controller)的结构 1 .controller("控制器的名字",function($scoppe){ 2 ..

深究angularJS系列 - 初识

AngularJS是什么?概念?特征?优点?缺点?那都不是事,话不多说,直接搞起O(∩_∩)O~~ 安装 1.官网http://angularjs.org/下载安装 2.开源库http://www.bootcdn.cn/下载安装 3.bower(一种包管理器)下载安装 bower install angular MVC MVC即"模型 - 视图 - 控制器"的简称,一种设计模式,MVC的从逻辑上将代码清晰地分割为三层,这样可以对每个部分进行独立开发.测试和维护. 模型/Model -

《C#高级编程》笔记系列第三弹

我们在开发WinForm时,经常会看到partial关键字,比如,我们新建一个Windows Form时,后台代码自动添加如下: 1 public partial class Form1 : Form2 {3     public Form1()4     {5         InitializeComponent();6     }7 } <C#高级编程>书中说明:partial关键字允许把类.结构或接口放在多个文件中.一般情况下,一个类存储在单个文件中,但有时,多个开发人员需要访问同一个

实现HTTPS系列第四弹之【TLS ,SSL等概念理解】

博文说明[前言]: 本文将通过个人口吻介绍TLS ,SSL,PKI等相关知识,在目前时间点[2017年5月21号]下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容. 1.第一弹:实现HTTPS系列第一弹之[http,https,www,web等概念简介] 博文链接:http://watchmen.blog.51cto.com/6091957/1922919 2.第二弹:实现HTTPS系列

Spark源码系列(三)作业运行过程

导读 看这篇文章的时候,最好是能够跟着代码一起看,我是边看代码边写的,所以这篇文章的前进过程也就是我看代码的推进过程. 作业执行 上一章讲了RDD的转换,但是没讲作业的运行,它和Driver Program的关系是啥,和RDD的关系是啥? 官方给的例子里面,一执行collect方法就能出结果,那我们就从collect开始看吧,进入RDD,找到collect方法. def collect(): Array[T] = { val results = sc.runJob(this, (iter: It

javascript之【贪吃蛇系列】第一弹:简单的贪吃蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 以上博客是参考,毕竟第一次做,真让自己盲人摸象做不出来. 不过我在其上做了一些改进,界面等效果看起来更好一些. 下图是在Chrome上运行的效果,但是火狐和IE会不兼容,onkeydown事件不能正确调用 这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋: 下面就是把代码发上来,上边有详细的解释: <html> <head> <title>

日均百万PV架构第三弹(分布内容为王)

接续接上篇 缓存时代来临 为蓝本,继续改造我们的百万级站点架构,这次我们 拿之前存储静态内容的 nfs 开刀,众所周知 nfs 的多台集群节点下可能由于多重 原因(磁盘io , 网络带宽, 并发场景),不适合做文件共享系统的基础结构. 互联网站点中,存在大量图片或其他静态内容,并且这些内容一般在1M之内,对于 海量小文件,我们将采用mogilefs分布式文件系统来完成.其中概念自行google. # mogilefs分布式文件系统工作流程 架构已经愈发复杂,我们需要从新梳理一下.从下表中应该很容

《我与希乐仑》第三弹

此案编号:黄劳人仲 (2014) 办字 第518号 开庭前,发生了一个戏剧性的场景,对方来了三个人,一位是外服的李盼,一位是徐敏,但还有一位叫王霞的,尽然说是Selerant的HR,扯淡嘛!此人来审判庭的目的非常值得怀疑,首先我有充分的证据证明她不属于Selerant,很简单!我们可以去调阅她的人事档案,至少在2014年3月26日当天,她肯定不属于Selerant,因为我清楚地记得她是徐敏的朋友,所以罗,纯粹是打酱油的,也或许是来拉关系的.你说一个不相干的人,庭上基本没说话,那她来干什么?这又不

codechef营养题 第三弹

第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Race in Byteland. There are N motorcyclists taking part in the competition. Johnny is watching the race. At the present moment (time 0), Johnny has taken