前端框架 - AngularJS入门
1、AngularJS简介
AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前
端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、
模块化、自动化双向数据绑定、依赖注入等等。
2、AngularJS四大特征
2.1、MVC模式
Angular遵循软件工程的MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入
(dependency injection),Angular为客户端的Web应用带来了传统服务端的服务,例如独立于
视图的控制。 因此,后端减少了许多负担,产生了更轻的Web应用。
Model:数据,其实就是angular变量($scope.XX);
View: 数据的呈现,Html+Directive(指令);
Controller:操作数据,就是function,数据的增删改查;
2.2、双向绑定
AngularJS是建立在这样的信念上的:即声明式编程应该用于构建用户界面以及编写软件构建,而
指令式编程非常适合来表示业务逻辑。框架采用并扩展了传统HTML,通过双向的数据绑定来适应动态
内容,双向的数据绑定允许模型和视图之间的自动同步。因此,AngularJS使得对DOM的操作不再重
重要并提升了可测试性。
2.3、依赖注入
依赖注入(Dependency Injection,简称DI)是一种设计模式, 指某个对象依赖的其他对象无需手工创
建,只需要“吼一嗓子”,则此对象在创建时,其依赖的对象由框架来自动创建并注入进来,其实就是
最少知识法则;模块中所有的service和provider两类对象,都可以根据形参名称实现DI.
2.4、模块化设计
高内聚低耦合法则
1)官方提供的模块 ng、ngRoute、ngAnimate
2)用户自定义的模块 angular.module('模块名',[ ])
3、入门小Demo
3.1、表达式
Document {{100+100}}
执行结果:
表达式的写法是{{表达式 }} 表达式可以是变量或是运算式
ng-app 指令 作用是告诉子元素一下的指令是归angularJs的,angularJs会识别的
ng-app 指令定义了 AngularJS 应用程序的 根元素。
ng-app 指令在网页加载完毕时会自动引导(自动初始化)应用程序。
3.2、双向绑定
Document 请输入你的姓名:ng-model="myname">
{{myname}},你好
运行结果:
ng-model 指令用于绑定变量,这样用户在文本框输入的内容会绑定到变量上,而表达式可以实时地输出变量。
3.3、初始化指令
我们如果希望有些变量具有初始值,可以使用ng-init指令来对变量初始化。
Document ng-init="myname='周杰伦'">请输入你的姓名:
{{myname}},你好
3.4、控制器
Document
ng-controller="myController">
x:
y:
运算结果:{{add()}}
ng-controller用于指定所使用的控制器。
理解 $scope:
$scope 的使用贯穿整个 AngularJS App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了$scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 $scope,同样的$scope 发生改变时也会立刻重新渲染视图.
3.5、事件指令
Document
x:
y:
结果:{{z}}
ng-click 是最常用的单击事件指令,再点击时触发控制器的某个方法。
3.6、循环数组
Document
ng-repeat="x in list">{{x}}
这里的ng-repeat指令用于循环数组变量。
3.7、循环对象数组
Document
姓名 数学 语文
{{entity.name}} {{entity.shuxue}} {{entity.yuwen}}
运行结果:
3.8、内置服务
我们的数据一般都是从后端获取的,那么如何获取数据呢?我们一般使用内置服务$http来实现。注意:以下代码需要在tomcat中运行。
Document
姓名 数学 语文
{{entity.name}} {{entity.shuxue}} {{entity.yuwen}}
建立文件 data.json
[{"name":"张三","shuxue":100,"yuwen":93},{"name":"李四","shuxue":88,"yuwen":87},{"name":"王五","shuxue":77,"yuwen":56},{"name":"赵六","shuxue":67,"yuwen":86}
]
3.9、自定义服务
在angularJS中,我们看代码,JS和html都放在一起,并不利于我们后期的维护。我们可以在前端代码中也
运用MVC的设计模式,将代码进行分离,提高程序的可维护性。
在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用。我们在上次课中
使用了内置服务$http .其实我们也可以自己来定义服务,而服务会封装一些操作。我们在不同的控制
器中可以调用同一个服务,这样服务的代码将会被重用。
对于base.js和base_pagination.js,base.js用于不需要分页功能的页面,base_pagination.js
用于需要分页功能的页面.
base.js
var app=angular.module('pinyougou',[]);//定义模块
base_pagination.js
var app=angular.module('pinyougou',['pagination']);//定义模块
服务层
//服务层
app.service('brandService',function($http){//读取列表数据绑定到表单中this.findAll=function(){return $http.get('../brand/findAll.do'); }//分页 this.findPage=function(page,rows){return $http.get('../brand/findPage.do?page='+page+'&rows='+rows);}//查询实体this.findOne=function(id){return $http.get('../brand/findOne.do?id='+id);}//增加 this.add=function(entity){return $http.post('../brand/add.do',entity );}//修改 this.update=function(entity){return $http.post('../brand/update.do',entity );}//删除this.dele=function(ids){return $http.get('../brand/delete.do?ids='+ids);}//搜索this.search=function(page,rows,searchEntity){return $http.post('../brand/search.do?page='+page+"&rows="+rows, searchEntity);} //下拉列表数据this.selectOptionList=function(){return $http.get('../brand/selectOptionList.do');}});
控制层
baseController
//品牌控制层
app.controller('baseController' ,function($scope){ //重新加载列表 数据$scope.reloadList=function(){//切换页码 $scope.search( $scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage); }//分页控件配置 $scope.paginationConf = {currentPage: 1,totalItems: 10,itemsPerPage: 10,perPageOptions: [10, 20, 30, 40, 50],onChange: function(){$scope.reloadList();//重新加载}}; $scope.selectIds=[];//选中的ID集合 //更新复选$scope.updateSelection = function($event, id) { if($event.target.checked){//如果是被选中,则增加到数组$scope.selectIds.push( id); }else{var idx = $scope.selectIds.indexOf(id);$scope.selectIds.splice(idx, 1);//删除 }}$scope.jsonToString=function(jsonString,key){var json= JSON.parse(jsonString);var value="";for(var i=0;i0){value+=",";} value +=json[i][key]; }return value;}});
//控制层
app.controller('brandController' ,function($scope,$controller ,brandService){ $controller('baseController',{$scope:$scope});//继承//读取列表数据绑定到表单中 $scope.findAll=function(){brandService.findAll().success(function(response){$scope.list=response;} );} //分页$scope.findPage=function(page,rows){ brandService.findPage(page,rows).success(function(response){$scope.list=response.rows; $scope.paginationConf.totalItems=response.total;//更新总记录数} );}//查询实体 $scope.findOne=function(id){ brandService.findOne(id).success(function(response){$scope.entity= response; }); }//保存 $scope.save=function(){ var serviceObject;//服务层对象 if($scope.entity.id!=null){//如果有IDserviceObject=brandService.update( $scope.entity ); //修改 }else{serviceObject=brandService.add( $scope.entity );//增加 } serviceObject.success(function(response){if(response.success){//重新查询 $scope.reloadList();//重新加载}else{alert(response.message);}} ); }//批量删除 $scope.dele=function(){ //获取选中的复选框 brandService.dele( $scope.selectIds ).success(function(response){if(response.success){$scope.reloadList();//刷新列表$scope.selectIds=[];} } ); }$scope.searchEntity={};//定义搜索对象 //搜索$scope.search=function(page,rows){ brandService.search(page,rows,$scope.searchEntity).success(function(response){$scope.list=response.rows; $scope.paginationConf.totalItems=response.total;//更新总记录数} );}});
4、控制器继承
需求分析
项目中有些功能是每个页面都有可能用到的,比如分页,复选等等,如果我们再开发另一个功能,
还需要重复编写。怎么能让这些通用的功能只写一次呢?我们通过继承的方式来实现。
基本控制器
//基本控制层
app.controller('baseController' ,function($scope){ //重新加载列表 数据$scope.reloadList=function(){//切换页码 $scope.search( $scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage); }//分页控件配置 $scope.paginationConf = {currentPage: 1,totalItems: 10,itemsPerPage: 10,perPageOptions: [10, 20, 30, 40, 50],onChange: function(){$scope.reloadList();//重新加载}}; $scope.selectIds=[];//选中的ID集合 //更新复选$scope.updateSelection = function($event, id) { if($event.target.checked){//如果是被选中,则增加到数组$scope.selectIds.push( id); }else{var idx = $scope.selectIds.indexOf(id);$scope.selectIds.splice(idx, 1);//删除 }}
});
//品牌控制层
app.controller('brandController' ,function($scope,$controller,brandService){ $controller('baseController',{$scope:$scope});//继承 //读取列表数据绑定到表单中 $scope.findAll=function(){brandService.findAll().success(function(response){$scope.list=response;} );} //其它方法省略........
});
$controller也是angular提供的一个服务,可以实现伪继承,实际上就是与BaseController共享$scope
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
