本文共 7849 字,大约阅读时间需要 26 分钟。
本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:尚硅谷
jQuery是JS的函数库,主要用来封装简化DOM操作。而AngularJS是Google开源的前端JS结构化框架,它的主体不再是DOM,而是页面中动态的数据。学习它可为后续学习React和VUE框架打下良好基础。
AngularJS做什么项目? 它用来构建单页面(SPA)Web应用或Web App应用。
单页面应用(SPA):single page application 特点:
AngularJS特性和优点:
用到的资源:
接下来用到的是Angular1.x的版本,它也有2.x和4.x版本,4.x只是在2.x的基础上添加了一些很小的部分。选择1.x版本是因为,它的语法是JS,而2.x和4.x的语法是typescript。
先看用jQuery实现的:
您输入的内容是:
Angualar实现的:(可以明显看出比jQuery还精简)
您输入的内容是:{ {username}}
说明:
$rootScope
根作用域对象($rootScope)
的属性1、表达式:通常有一个返回值,可以放在任何需要值的地方,比如函数调用的参数,一个变量名,一个运算。
2、语句:通常表示一个完整的执行单位,一段完整的js可执行的代码,有的语句也可以用表达式来执行,叫做表达式语句。
3、区别:语句用分号结尾,有些语句我们没有加分号,比如console.log虽然我们没有加分号,但也是语句,因为js引擎会自动解析并且加上分号。
说明:
ng-model
指令 数据从View==>Model{ {}}
表达式 数据从Model==>Viewng-model
是双向数据绑定, 而{ {}}
是单向数据绑定ng-init
用来初始化当前作用域变量。现在通过该例应该对第一个AngularJS的程序的结构和用法有所了解了。也就是说:
通过设置ng-app(指令)
,它就会帮我们自动创建一个$rootScope
根作用域对象。 通过设置ng-model
就可以将当前输入框的值当作新的属性值,传给对应的属性名(它是当前作用域对象($rootScope)
的属性),从而修改这个属性名的属性值。 通过设置ng-init
可以用来初始化当前作用域变量。 当我们想使用这个属性值的时候,使用{ {属性名}}
就可以显示数据。当然是从作用域对象的指定属性名上取。 当代码运行起来的时候,就会发现因为设置了ng-init
,所以输入框和输出结果都会显示这个初始值。这其中,我们无法通过修改输出结果,即{ {属性名}}
来修改属性值,所以它是单向数据绑定(只能从Model流向View)。而我们显然可以通过修改输入文本框来修改属性值,即View流向Model(从页面上输入送到了作用域对象),所以ng-model
是双向数据绑定(即能显示属性值,又能修改属性值)。而ng-init
的值的变化也只能依靠其他方法的修改,所以它也是单向数据绑定(只能从View流向Model)。
02_(双向)数据绑定 姓名1:{
{name}}姓名2:{
{name}}
说明:在接下来的代码中,涉及到控制器对象。它是用来控制AngularJS应用数据的实例对象,是我们View与Model之间的桥梁。当我们使用了ng-controller
指令,我们需要指定控制器的构造函数,这个形参必须是$scope
。这里$scope
就是依赖对象,被angular动态注入。然后Angular就会自动new此函数创建控制器对象。每定义一个ng-controller
指令, 内部就会创建一个新的作用域对象($scope
), 并自动注入构造函数中,在函数内部可以直接使用$scope
对象。这就是依赖注入。
输入的姓名为: {
{firstName+'-'+lastName}}输入的姓名2为: {
{getName()}}{ {firstName}}
$rootScope
)ng-controller
指令,我们需要指定控制器的构造函数(必须定义一个$scope
的形参),然后Angular就会自动new此函数创建控制器对象ng-controller
指令, 内部就会创建一个新的作用域对象($scope
), 并自动注入构造函数中,在函数内部可以直接使用$scope
对象输入的姓名为: {
{firstName+'-'+lastName}}输入的姓名2为: {
{getName()}}{ {firstName}}
angular.module('模块名', [依赖的模块])
如: var module = angular.module('模块名',[]);
(只要不涉及第三方模块,[]
里就不用添加任何东西)module.controller('MyController', function($scope){//操作$scope的语句})
说明:
在上段代码中,要生成作用域对象,是需要提前构造一个构造函数的,开发中不这么用,同时新版本也不支持这么用,所以现在选择模块对象。(这里选用angular-1.5.5版本)angular.module
可在全局位置创建、注册、获取Angular模块。所有模块(angular核心或第三方)都必须使用这个机制注册才能在应用中生效。
当我们获取到了模块,就可以通过module.controller('MyController', function($scope){//操作$scope的语句})
的方式来添加控制器了。
员工名:{
{empName}}员工:{
{empName}}
{ {js表达式}}
{
{1}}{
{'尚硅谷'}}{
{true}}{
{undefined}}{
{'atguigu'+3}}{
{4+3}}{
{a+b}}{
{p.name}}---{ {p.age}}----{ {arr[2]}}
价格计算器(自动)
数量: 价格:总计:{
{count1 * price1}}价格计算器(手动)
数量: 价格:总计:{
{totalPrice}}人员信息列表
- 偶数行:{ {$even}},奇数行:{ {$odd}},中间的:{ {$middle}}, 最后一个:{ {$last}},第一个:{ {$first}},第{ {$index + 1}}个, { {person.name}}----{ {person.age}}
{
{'asdfdsfds'}}{
{count2}}我喜欢
喜欢我
- { {p.name}}---{ {p.age}}
Title 我的笔记
剩余字数:{
{getCount()}}
app.js
angular.module('noteApp', []) .controller('NoteController', function ($scope) { $scope.message = ''; //定义获取剩余字数的方法 $scope.getCount = function () { //判断输入数据的长度 if(this.message.length > 100){ $scope.message = $scope.message.slice(0, 100); } //返回剩余字数的个数 return 100 - $scope.message.length; }; //定义保存的方法 $scope.save = function () { alert('note is saved'); //将数据保存到sessionStorage中 sessionStorage.setItem('note_key', JSON.stringify($scope.message)); //将输入内容清空 $scope.message = ''; }; //定义读取的方法 $scope.read = function () { $scope.message = JSON.parse(sessionStorage.getItem('note_key') || '[]');//对读取null做了处理 }; // 定义删除的方法 $scope.delete = function () { $scope.message = ''; }; });
Title 我的备忘录
{ {todo.todo}}
app.js
angular.module('todoApp', []) .controller('TodoControl', function ($scope) { //初始化数据 $scope.todos = [ { todo : '吃饭', isChecked : false}, { todo : '睡觉', isChecked : false}, { todo : '打豆豆', isChecked : false} ]; //定义添加todo的方法 $scope.add = function () { //判断添加的内容是否为空 if(!$scope.newTodo){ alert('输入的内容不能空'); return } // 组合新的todo对象 var todo = { todo : $scope.newTodo, isChecked : false }; // 将新的对象添加到todos中 $scope.todos.unshift(todo); //添加完将输入的内容清空 $scope.newTodo = ''; }; //定义删除 todo 的方法 $scope.delete = function () { //将$scope.todo的数据暂时保存 var oldTodo = $scope.todos; //将$scope.todos的数据清空 $scope.todos = []; //进行遍历 oldTodo.forEach(function (item, index) { //将没被选中的todo添加到 $scope.todos 数组中 if(!item.isChecked){ $scope.todos.push(item); } }); } });
转载地址:http://moyki.baihongyu.com/