一、AngularJS应用剖析

  AngularJS存在一些最主要的构件,如模型,视图和控制器。但AngularJS中也有许多其他可供灵活使用的部件,包括模块,指令,过滤器,工厂和服务。

  一 . 1 依赖注入

  没有依赖注入(dependencies injector),就不得不以某种方式找到自己所需要的组件,很可能得使用到全局变量。虽然这样子也能工作,但是不如AngularJS的依赖注入来的简单。依赖注入,可以通过让某个组件的工厂函数的参数上声明依赖来实现,这个函数使用参数来提出需求: "Hey! AngularJS兄弟,我需要这样子的一个构件!"

app.controller("HelloController", function($scope, $timeout){//hey, AngularJS 我需要$scope,和$timeout//为了我能正常运行,麻烦你先把这两个构件帮我准备一下吧! })

  依赖注入的主要好处是AngularJS辅助管理组件,并在需要时提供给相应的函数。依赖注入还为测试带来好处。

  一 . 2 工人和工人函数

  简单的概念:AngularJS在需要建立构件时将调用工厂函数,当需要使用该构件时就会调用工人。相当于,工厂函数是模具,工人则是通过这个模具制造出来的实体。工厂函数负责创建那些来执行工作的对象,工厂函数往往会返回一个工人函数。下面的这个例子中,第一个function便是工厂函数,return的内容则是一个工人(对象实例)。

app.directive("Hello", function(){return function(scope, ele, attrs){ //....  } })

  一 . 3 . 1 使用模块工作

  随着应用程序随着时间的推移会变得复杂,因此我们需要使用模块来使我们对程序进行更有效、编辑的管理测试和工作。模块具有三种主要角色:1. 将一个AngularJS程序与HTML文档中的一部分进行关联(ng-app作用范围)。2. 帮助我们组织AngularJS应用程序中的代码和组件

var app = angular.module("myApp", ["app.Controllers", "app.Filters", "app.Servers", "app.Directive"]);
...

  其中,这些依赖并不是必须按照某种特定的顺序定义的。但是AngularJS会保证这些具有依赖的模块(此处的app模块)会首先调用其(app模块)所依赖("app.Controllers", "app.Filters", "app.Servers", "app.Directive")的回调函数。相当于,有个哥们想自己组装一部四驱车,那他会把轮子,车身,电池什么的先给准备好。

  一 . 3. 2 config与run

  config方法会接受一个函数,这个函数会在相应模块被调用之后被调用。config方法常常会通过注入其他服务的值的方式来配置模块

app.config(function($httpProvider){//...
})

  run方法也会接受一个函数,但是该函数之会在所有模块都加载完以及解析完它们的依赖之后才会被调用

app.run(function($rootScope){//...
])

  执行顺序——一个例子

  App.Servives模块的config回调函数

  App模块的config回调函数

  App.Servives模块的run回调函数

  App模块的run回调函数

  二、AngularJS指令系统

  二、1 数据绑定类指令

    数据绑定类指令是负责执行数据绑定的,数据绑定是使用模型中的值并将它插入到HTML文档中。

    1. ng-bind-template 大家都知道ng-bind会替换它被用到的元素内容,而且ng-bind受限于只能处理单个数据绑定的表达式 <span ng-bind="bool"></span,

   当需要进行创造多个数据绑定便可以使用灵活的ng-bind-template

<div ng-bind-template="First: {{my.mum}} and {{my.dad}}">

    2. ng-non-bindable 阻止内联数据绑定

     AngularJS不是说唯一使用{{  }}符号的JavaScript包,因此如果同时使用多个库可能会遇到问题,或者我仅仅是想输出"{{  }}"这个符合。AngularJS在请求绑定到一个不存在的模型属性时不会报错。例如 AngularJS uses {{ and }} characters for tempalte 会被替换成 AngularJS uses characters for tempalte  ,因此使用ng-non-bindable可以为我们解决这个问题,以下实例会输出 AngularJS uses {{ and }} characters for tempalte

<div ng-non-bindable>AngularJS uses {{ and }} characters for tempalte
</div>

   二、2 模板类指令

    1. ng-repeat

<li ng-repeat="(key, value) in item">{{key}} = {{value}}
</li>

    当遍历目标是对象时, key为当前属性名,value为对象属性的值。而当遍历目标是集合(如一个数组)时, key为当前的遍历下标(从0开始),value为集合的值

    ng-repeat的内置变量

    $index: 返回当前的遍历下标

    $first/$last: 若当前对象时遍历集合的第一/最后一个元素,则返回true

    $even/$odd: 若当前对象时遍历集合的第偶数个/第奇数个元素,则返回true

    $middle: 若当前对象时遍历集合的中间元素(不是第一或者最后一个元素),则返回true

    ng-repeat + ng-if

    我们无法再ng-repeat指令所应用到的同一个元素上使用ng-if <li ng-repeat="item in Objs" ng-if="item.exist">{{item.name}}</li> 这样子会报错。我们应该先把数据通过filter服务整合出来后,再用ng-repeat遍历访问 <li ng-repeat="item in Objs | filter: {exist: 'true'}" >{{item.name}}</li>

    2. ng-include

     <ng-include src=" 'template.html' "></ng-include>  请注意,此处有坑,双引号里面还有一个单引号。

    ng-include的配置参数

    src: 指定加载内容的URL;onload: 指定一内容被加载后调用的计算表达式;autoscroll: 指定内容被加载时,是否滚动到这部分视图所在区域(注:小鹏我在实验时发现这个配置参数并没有运行..不知道是不是哪里引用错误了)

    ng-include VS ng-switch

    ng-switch适合用于复杂度不高,内容较小的时候使用。ng-include适用于复杂性较大,内容较多的页面,但首次加载时,AngularJS会使用ajax来请求模板,因此会有延迟。

  二、3 事件类指令

    我们可以通过分辨发事件对象中event.type属性,来处理在发生同一元素上不同的事件<li ng-repeat="item in items" ng-mouseenter="handle($event)" ng-mouseleave="handle($event)">  。但是应该注意:AngularJS为事件指令所用的事件名称和底层事件的type属性之间存在不匹配的情况。例如 ng-mouseenter="handle($event)"  但他的 event.type == "mouseover" 。因此,我们在处理此类情况情况时,应当先确认事件的底层名称。

$scope.handle(event){console.log(event.type)
}

  二、4 布尔属性类指令

  ng-check 管理checked属性(input="checkbox")

  ng-diabled 管理disabled属性(input与button元素)

  ng-open 管理open属性(detail元素)

  ng-readonly 管理readonly属性(input元素)

  ng-selected 管理selectes属性(option元素)

  

  资料参考:

  《AngularJS高级程序设计》

《AngularJS高级程序设计》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. 独家 | 一文了解强化学习的商业应用2
  2. Leetcode 88. 合并两个有序数组 解题思路及C++实现
  3. wordpress留言板comments.php添加自定义字段,php – 如何在WordPress / WooCommerce 3中的注释表单中添加自定义字段...
  4. C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。
  5. mongodb副本集修改配置问题
  6. UEFI 引导与 BIOS 引导
  7. Python之父再度发声:我们能为中国的“996”程序员做什么?
  8. 自动驾驶技术(1)--控制工程篇概述
  9. Github每日精选(第16期):录屏工具ScreenToGif
  10. php js轮播图片代码,js图片轮播手动切换效果实例代码
  11. netty权威指南 微云_《Netty权威指南》(一)走进 Java NIO
  12. Android蓝牙音量调节,安卓 蓝牙音量控制 Bluetooth Volume Control v2.40 付费高级特别版...
  13. 操作系统(02326)自考学习笔记/备考资料
  14. SAP固定资产中的几个日期
  15. Serverless Computing Fass $ openwhisk快速部署、应用、实例
  16. SOLIDWORKS motion如何进行运动仿真
  17. 网站卡其cdn后不能访问_网站使用CDN加速后,网站无法访问如何解决
  18. jzoj3823 遇见 [高斯消元解异或方程组]
  19. 短视频矩阵系统,抖音矩阵系统,抖音SEO源码
  20. 最新视频打赏源码视频打赏系统

热门文章

  1. 查 oracle 的sid,oracle 查询sid 运行的sql语句
  2. ajax返回的java list_ssm+ajax异步请求返回list遍历
  3. Jquery之append()和html()的区别
  4. Mysql type字段值1改为2,2改为1
  5. 专题六:数值微积分与方程求解
  6. 编程基本功:带着本子却不记录,你以为听懂了记住了,不可能的
  7. 编程基本功:代码都写不好,还写什么注释
  8. Package ffnvcodec was not found in the pkg-config search path
  9. 软件基本功:工作目标经常变化,要及时跟进
  10. TensorRT:AttributeError: 'module' object has no attribute 'Logger'