Angular 学习笔记(四)
作用域和控制器的交互情况:
1、控制器通过作用域对模板暴露一些方法供其调用
2、控制器中定义的一些方法可改变注册在作用域下的数据模型
3、控制器在某些场合可能需设置监听器来监听作用域中的数据模型;这些监听器在控制器的相关方法被调用时立即执行
注:用 $watch 进行脏值检查时,一定不要做任何的 DOM 操作,因为 DOM 操作拖慢甚至是拖垮整体性能的能力比在 JavaScript 对象上做属性操作高好几个数量级!!
Angular 中对作用域进行脏值检查实时跟踪数据模型的变化是一个非常频繁的操作
指令分类:
监测型指令:需要在 $watch() 方法中注册一个监听处理器来监听控制器或别的操作引起的表达式值改变,进而更新视图
监听型指令:像 ng-click,这种是在 HTML 标签属性中直接写好当 ng-click 发生什么时调用什么处理器,
当 DOM 监听到1 ng-click 被触发时,这个指令就会通过 $apply() 方法执行相关的表达式操作或是别的操作更新视图
注:在编译阶段,编译器在 HTML 解析器解析页面遇到非传统的或自己不能识别的标签或别的表达式时,
Angular 编译器就将这些 HTML 不懂的东西(指令)在当前 DOM 环境下解析出来
无论哪种指令,当外部事件发生时,相关的表达式必须通过 $apply() 作用于相应的作用域,这样所有的监听器才能被正确更新,然后进行后续操作
大多数情况下,指令和作用域相互作用,但并不会创建作用域的新实例
==》但一些特殊的指令(如 ng-controller、ng-repeat 等)则会创建新的下级作用域,并把这些新建的作用域和拥有相应的 DOM 元素相关联
依赖注入(DI):
1、含义:是一种让代码管理其依赖关系的设计模式
2、三种获取依赖对象的方式:
a、创建依赖,通常是通过 new 操作符
b、查找依赖,在一个全局的注册表中查阅它
c、传入依赖,需要此依赖的地方等待依赖对象注入进来
注:a 和 b 不理想,c 中 当 app 的某处声明需要用到某个依赖时,Angular 会调用这个依赖注入器去查找或是创建所需的依赖,然后返回回来给你使用
依赖注入的三种风格:
1、推断依赖:最简单的获取依赖的方法是让你的函数的参数名直接使用依赖名
function MyController($scope, greeter){
...
}
注:给 injector 一个函数,它可通过检查函数声明并抽取参数名可以推断需要注入的服务名,上述 $scope 和 greeter 是两个需要被注入到函数中的服务
它对压缩的 JavaScript 代码不起作用,因为压缩后会重命名函数的参数,这种风格只对 pretotyping 和 demo 级应用有用
2、$inject 注释:为了让重命名了参数的压缩版的 JavaScript 代码能够正确地注入相关依赖服务,函数需通过 $inject 属性进行标注(存放需要注入的服务的数组)
注:$inject 数组中的服务名顺序必须和函数参数名顺序一致
var myController = function (renamed$scope, renamedGreeter) {
...
}
myController['$inject'] = ['$scope', 'greeter'];
注:$inject 有时会导致代码膨胀(如标志指令时)
3、someModule.factory('greeter', ['$window', function(renamed$window){
...
}]);
注:最好的一种方式,千万不要将中括号外的 ‘greeter’ 和括号内的 ‘$window’ 混淆,前者是声明创建依赖,后者是注入依赖
Angular 模板:
是一个声明式的视图,它指定信息从模型、控制器变成用户在浏览器上可以看见的视图
静态的 DOM ==》动态的 DOM
1、指令:一个可扩展已有 DOM 元素或代表可复用的 DOM 组件,用可扩展属性标记
2、表达式:用双括号 {{expression}} 给元素绑定表达式
3、过滤器:格式化数据显示在界面上
4、表单控件:验证用户输入
在 Angular 中,以上元素属性可直接在模板中使用,除了在模板中声明元素外,可在 JavaScript 代码中访问这些元素
Angular 使用大的 CSS 类:
1、ng-scope:把这个类附加到所有创建了新作用域的 HTML 元素上
2、ng-binding:把这个类附加到所有通过 ng-bind 或绑定了任何数据的元素上
3、ng-invalid、ng-valid:附加到进行了验证操作的所有 input 组件元素上
4、ng-pristine、ng-dirty:angular 的 input 指令给所有新的、还未与用户交互的 input 元素附加上 ng-pristine;当用户有任何输入时,则附加上 ng-dirty
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>class test</title>
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
<!--当无效输入时为红色,有效输入为绿色,没有输入为黄色-->
<style>
.ng-invalid.ng-dirty {
border-color: red;
}
.ng-valid.ng-dirty {
border-color: green;
}
.ng-pristine {
border-color: yellow;
}
</style>
</head>
<body>
<form name="myForm" ng-app="myApp" ng-controller="myCtrl" ng-submit="myForm.$valid" novalidate>
<input name="myName" ng-model="name" required>
<span ng-show="myForm.myName.$invalid" ng-hide="myForm.myName.$pristine || myForm.myName.$valid">
Your name must be required!
</span><br>
<input name="myAge" ng-model="age" type="number" max="50" min="10" required>
<!--根据年龄是否有效来确定是否显示该 span-->
<span ng-hide="myForm.myAge.$pristine || myForm.myAge.$valid" ng-show="myForm.myAge.$invalid">
The age range must be between 10 to 50
</span><br>
<label>Hello, my name is {{name}}, I am {{age}} years old</label><br>
<input type="submit" onclick="alert('submit me')" value="提交">
</form>
<script>
angular.module("myApp", []).controller("myCtrl", ["$scope", function ($scope) {
$scope.name = "Lemon";
$scope.age = 18;
}]);
</script>
</body>
</html>
Angular 学习笔记(四)的更多相关文章
- angular学习笔记(四)- input元素的ng-model属性
input元素的ng-model属性: 用于将input的值和变量的值进行双向绑定 <!DOCTYPE html> <html ng-app> <head> < ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(2)-restrice,replace,template
本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
随机推荐
- 在vue组件中设置定时器和清除定时器
由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器.但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要 ...
- RDIFramework.NET敏捷开发框架 ━ 工作流程组件Web业务平台
接前两篇: RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍 RDIFramework.NET敏捷开发框架 ━ 工作流程组件WinForm业务平台 1.RDIFramework.NE ...
- zip 命令使用记录
常常会用到 zip 命令,但是时间一长,就忘记了具体参数,下面简要记录,进行备忘: 常用命令: zip -q -r nvprof_test_out.zip nvprof_test_out/ # 压缩 ...
- python anaconda 常用操作;conda 命令指南
在使用 python anaconda时,经常会用到很多常用操作,记录下来,方便以后更好地使用: conda: Conda既是一个包管理器又是一个环境管理器.你肯定知道包管理器,它可以帮你发现和查看包 ...
- 高通平台:USB充电【转】
USB Battery Charging V1.2 Specification 定义了USB充电器的类型或者叫做充电源. 1. 支持的充电器类型 1.1 Standard Downstream Por ...
- [Go] protobuffer 的环境配置
一般使用gprc是需要使用protobuf作为数据传输的格式标准,可以对要传输的对象结构体进行序列化 先安装protoc,找到对应版本,下载直接把二进制文件复制到环境变量可以访问到的地方就行 http ...
- The Preliminary Contest for ICPC Asia Shenyang 2019
传送门 B. Dudu's maze 题意: 是什么鬼东西???我读题可以读半小时QAQ 给出一张无向图,一个人在里面收集糖果,每个点都有一个糖果,特殊点除外.当他第一次进入特殊点时,会随机往一条边走 ...
- qtdomdocument找不到
- Where does Oracle SQL Developer store connections? oracle SQL Developer 连接信息保存的位置,什么地方
oracle SQL Developer 连接信息保存的位置,在什么地方? 在切换登录用户后,oracle SQL Developer 连接信息不见了.只要以前的用户信息还存在,可以在路径 C:\Us ...
- 【微信小程序】mpvue中页面之间传值(全网唯一真正可行的方法,中指推了一下隐形眼镜)
摘要: mpvue中页面之间传值(注意:是页面之间,不是组件之间) 场景:A页面跳转B页面,在B页面选择商品,将商品名带回A页面并显示 使用api: getCurrentPages step1: A页 ...