EverydayOneCat
Cello
一、AngularJS入门
1.AngularJS简介
AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、依赖注入等等。
2.AngularJS四大特征
2.1MVC 模式
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.用法
3.1双向绑定
表达式的写法是 表达式可以是变量或是运算式
ng-app 指令 作用是告诉子元素一下的指令是归angularJs的,angularJs会识别的
ng-app 指令定义了 AngularJS 应用程序的 根元素。
ng-app 指令在网页加载完毕时会自动引导(自动初始化)应用程序。
ng-model 指令用于绑定变量,这样用户在文本框输入的内容会绑定到变量上,而表达式可以实时地输出变量。
我们如果希望有些变量具有初始值,可以使用ng-init指令来对变量初始化
1 | <html> |
3.2控制器/循环
1 |
|
3.3内置服务
我们的数据一般都是从后端获取的,那么如何获取数据呢?我们一般使用内置服务$http来实现。
建立文件 data.json
1 | [ |
注意:以下代码需要在tomcat中运行。
1 | <script> |
二、品牌管理
下面我们通过品优购品牌管理部分来对AngularJs进行更加深入的了解与使用。也会简要概述后端实现,基本都是增删改查,着重还是看前端用AngularJs如何实现。
1.列表
实现品牌列表的查询(不用分页和条件查询)
1.1后端
1 |
|
1 | //返回全部列表 |
1.2前端
1 | <script src="../plugins/angularjs/angular.min.js"></script> |
body加上 ng-app=”pinyougou” ng-controller=”brandController” ng-init=”findAll()”
1 | <tr ng-repeat="entity in list"> |
2.分页
在品牌管理下方放置分页栏,实现分页功能
这里关于分页插件PageHelper的具体介绍可以看我的另一篇博客
2.1后端
在pinyougou-pojo工程中创建entity包,用于存放通用实体类,创建类PageResult
1 | /** |
1 |
|
1 | //返回分页列表 |
2.2前端
引入分页组件
1 | <!-- 分页组件开始 --> |
构建app模块时引入pagination模块
1 | var app = angular.module("pinyougou",["pagination"]);//定义模块 |
在页面的body元素上去掉ng-init指令的调用,因为onChange在第一次加载时也会触发,所以不需要初始化的指令
页面的表格下放置分页组件
1 | <!-- 分页 --> |
3.增加
3.1后端
在pinyougou-pojo的entity包下创建类Result.java用来返回状态及提示信息
1 | /** |
1 |
|
1 | //增加 |
3.2前端
1 | //保存 |
为了每次打开窗口没有遗留上次的数据,我们可以修改新建按钮,对entity变量进行清空操作
1 | <button type="button" class="btn btn-default" title="新建" data-toggle="modal" data-target="#editModal" |
4.修改
4.1后端
1 |
|
1 | //修改 |
4.2前端
由于我们修改和增加用的是同一个表单,只有一个保存按钮,我们需要对保存事件进行修改,使得两个都兼容
1 | //保存 |
5.删除
点击列表前的复选框,点击删除按钮,删除选中的品牌
5.1后端
1 |
|
1 | //批量删除 |
5.2前端
主要思路:我们需要定义一个用于存储选中ID的数组,当我们点击复选框后判断是选择还是取消选择,如果是选择就加到数组中,如果是取消选择就从数组中移除。在点击删除按钮时需要用到这个存储了ID的数组。
这里我们补充一下JS的关于数组操作的知识
(1)数组的push方法:向数组中添加元素
(2)数组的splice方法:从数组的指定位置移除指定个数的元素 ,参数1为位置 ,参数2位移除的个数
(3)复选框的checked属性:用于判断是否被选中
1 | $scope.selectIds=[];//选中的ID集合 |
修改列表的复选框
1 | <input type="checkbox" ng-click="updateSelection($event,entity.id)"> |
修改删除按钮
1 | <button type="button" class="btn btn-default" title="删除" ng-click="dele()"> |
6.条件查询
实现品牌条件查询功能,输入品牌名称、首字母后查询,并分页。
6.1后端
1 |
|
1 | //查询+分页 |
6.2前端
增加条件选项
1 | 品牌名称:<input ng-model="searchEntity.name"> 品牌首字母:<input ng-model="searchEntity.firstChar"> |
1 | $scope.searchEntity={};//定义搜索对象 |
修改reloadList方法
1 | //刷新列表 |
结语
2020死亡套餐:
张东升带你去爬山拍照
徐静带你游泳
严良带你到楼顶吹口哨
严良爸请你吃梨
晶晶踩你鞋子
普普喊你上五楼
周春红让你喝牛奶
马主任带你去六峰宾馆给你剥橘子
王瑶为你广播
王立带你去冷库
朱朝阳把你写在日记里
总结:我还有机会吗?