Angularjs 基础入门


Posted in Javascript onDecember 26, 2014

针对于这个其实我不太清楚应该针对于哪些人或者说不知道从哪开始写,所以这里我就按照一种简单的思路开始写

1.angular.element
2.angular.Bootstrap

我们非常清楚ng-app应用到节点,angular自动帮你初始化,初始化的过程分为如下几个步骤

1.angular会在document load的时候自动初始化,首先会找到ng-app这个指令指定的节点。
2.加载与module相关的指令
3.创建与应用相关的injector(依赖管理器)
4.以制定的ng-app为根节点,开始对Dom进行compile

现在我们自己初始化一下,做一个等同于ng-app这个指令的东西。angular.element这个就是包装,包装原始DOM元素或HTML字符串作为jQuery元素。angular.Bootstrap可以手动初始化脚本,我们用这两个来初始化这个脚本

<!DOCTYPE HTML>

  <html lang="zh-cn">

  <head>

  <meta charset="UTF-8">

  <title>Bootstrap-manual</title>

  <style type="text/css">

  .ng-cloak {

  display: none;

  }

  </style>

  </head>

  <body>

  这里是ng-app外面的~~{{1+2}}

  <div id="widuu" >这里是ng-app里面~~~ {{1+2}}</div>

  <script src="angular.min.js" type="text/javascript"></script>

  <script type="text/javascript">

  angular.element(document).ready(function() {

  angular.bootstrap(angular.element(document.getElementById("widuu")));

  });

  </script>

  </body>

  </html>

2.compiler

我们清楚的看到angularjs的官方文档上边都是驼峰式命名法,譬如ngApp、ngModule、ngBind等等这些都是相关的指令,其中html compiler就是允许我们自己定义元素 属性和标签,Angular将这些附加行为称为directives。
官方文档对compiler的解释是这样的

Compiler

  Compiler is an Angular service which traverses the DOM looking for attributes. The compilation process happens in two phases.
  Compile: traverse the DOM and collect all of the directives. The result is a linking function.
  Link: combine the directives with a scope and produce a live view. Any changes in the scope model are reflected in the view, and any user interactions with the view are reflected in the scope model. This makes the scope model the single source of truth.
  Some directives such as ng-repeat clone DOM elements once for each item in a collection. Having a compile and link phase improves performance since the cloned template only needs to be compiled once, and then linked once for each clone instance.

compiler是angular的一个(service),负责遍历dom节点和查找属性,编译分为两个阶段:

1.编译:遍历节点和收集所有的directives,返回一个链接函数linking function
2.链接:将directives绑定到一个作用域(scope)中,创建一个实况视图(live view)。在scope中的任何改变,将会在视图中得到体现(更新视图);任何用户对模版的活动(改变),将会体现在scope model中(双向绑定)。这使得scope model能够反映正确的值。
一些directives,诸如ng-repeat,会为每一个在集合(collection)中的元素复制一次特定的元素(组合)。编译和链接两个阶段,使性能得以提升。因为克隆出来的模版(template)只需要编译一次,然后为每一个集合中的元素进行一次链接(类似模版缓存)。

3.一步一步创建自己的directive

1.了解directive
首先了解,directive是按照驼峰式命名法,如ngModule,当编译的时候匹配是这样的,举例如下:

<input ng-model="foo">

  <input data-ng:model="foo">
 

directive可以使用x-或者data-作为前缀,可以使用:, -, 或者 _等分隔符来转换驼峰式命名方法,如下所示:

<span ng-bind="name"></span> <br/>

  <span ng:bind="name"></span> <br/>

  <span ng_bind="name"></span> <br/>

  <span data-ng-bind="name"></span> <br/>

  <span x-ng-bind="name"></span> <br/>

一般我们使用ng-bind对应ngBind,这种格式
$compile可以匹配directive基于元素名称,属性,类名以及注释

<my-dir></my-dir>

  <span my-dir="exp"></span>

  <!-- directive: my-dir exp -->

  <span class="my-dir: exp;"></span>

 在编译过程中,compiler通过$interpolate服务匹配文本与属性中的嵌入表达式(如{{something}})。这些表达式将会注册为watches,并且作为digest cycle的一部分,一同更新。下面是一个简单的interpolation:
<img src="img/{{username}}.jpg"/>Hello {{username}}!
  
2.编译的步骤

HTML“编译”的三个步骤:

1. 首先,通过浏览器的标准API,将HTML转换为DOM对象。这是很重要的一步。因为模版必须是可解析(符合规范)的HTML。这里可以跟大多数的模版系统做对比,它们一般是基于字符串的,而不是基于DOM元素的。
2. 对DOM的编译(compilation)是通过调用$comple()方法完成的。这个方法遍历DOM,对directive进行匹配。如果匹配成功,那么它将与对应的DOM一起,加入到directive列表中。只要所有与指定DOM关联的directive被识别出来,他们将按照优先级排序,并按照这个顺序执行他们的compile() 函数。directive的编译函数(compile function),拥有一个修改DOM结构的机会,并负责产生link() function的解析。$compile()方法返回一个组合的linking function,是所有directive自身的compile function返回的linking function的集合。
3. 通过上一步返回的linking function,将模版与scope连接起来。这反过来会调用directive自身的linking function,允许它们在元素上注册一些监听器(listener),以及与scope一起建立一些watches。这样得出的结果,是在scope与DOM之间的一个双向、即时的绑定。scope发生改变时,DOM会得到对应的响应。

var $compile = ...; // injected into your code

  var scope = ...;

  var html = '<div ng-bind='exp'></div>';

  // Step 1: parse HTML into DOM element

  var template = angular.element(html);

  // Step 2: compile the template

  var linkFn = $compile(template);

  // Step 3: link the compiled template with the scope.

  linkFn(scope);

ngAttr属性绑定

<svg>

  <circle ng-attr-cx="{{cx}}"></circle>

  </svg>

今天就写到这里,明天开始写创建directive ~~~控制篇幅不要太长,这章主要概念的多~~~

Javascript 相关文章推荐
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
JQuery处理json与ajax返回JSON实例代码
Jan 03 Javascript
js 金额格式化来回转换示例
Feb 23 Javascript
JavaScript函数作用域链分析
Feb 13 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
May 01 Javascript
react.js使用webpack搭配环境的入门教程
Aug 14 Javascript
对类Vue的MVVM前端库的实现代码
Sep 07 Javascript
KOA+egg.js集成kafka消息队列的示例
Nov 09 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
jQuery 实现侧边浮动导航菜单效果
Dec 26 #Javascript
Javascript的闭包详解
Dec 26 #Javascript
jQuery中focus事件用法实例
Dec 26 #Javascript
生成二维码方法汇总
Dec 26 #Javascript
Javascript中的五种数据类型详解
Dec 26 #Javascript
javascript工厂方式定义对象
Dec 26 #Javascript
jQuery中click事件用法实例
Dec 26 #Javascript
You might like
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php切割页面div内容的实现代码分享
2012/07/31 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
理解Javascript_08_函数对象
2010/10/15 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jquery validate demo 基础
2015/10/29 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python下载网络小说实例代码
2018/02/03 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
大学生找工作推荐信范文
2013/11/28 职场文书
承认错误的检讨书
2014/01/30 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
优秀团员事迹材料
2014/12/25 职场文书
董事会决议范本
2015/07/01 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
Spring 使用注解开发
2022/05/20 Java/Android
mysql中关键词exists的用法实例详解
2022/06/10 MySQL