前端框架 - 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指令来对变量初始化。


Documentng-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



    


    







本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部