AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
个人感觉《Angularjs in action》这本书写的很好,很流畅,循序渐进,深入浅出,关键是结合了一个托管于Github上的实例讲解的,有代码可查,对于初学者应该是个不错的途径。(不是打广告)其实书早已经看完一遍,脑瓜子里面已经存储了一些module、controller、directive、scope等等这些概念,但是怎么把这些东西串起来,用起来,不动手,还是不能检验看书的效果。所以从这篇就来结合自己的实操经验来分享下自己是如何消化(囫囵吞枣)这些概念和设计理念的。
设计初衷是要在原来的Angello项目的基础上添加一个模块Statistic,类似于User模块,但是在点进去User后,可以出来一个统计报告,用于显示出该用户每个status(toDo,inProgress,codeReview,qaReview, verified)下各有几个story,并根据这些status的个数绘制一个饼状图(基于D3引擎)。代码已经上传到Github上^^,欢迎来轻拍~~~
Github地址:https://github.com/DMinerJackie/angelloExtend (代码持续更新中。。。)
最终效果如下:
今天主要内容是一个从无到有,屡屡进坑又出坑过程的分享:
一.搭架子
1. 首先仿照其他模块,新建出statistic模块的目录结构
目录中包含了controllers、directives和存放html的tmpl,在statistic目录下新建Statistic.js用于声明一个模块,也就是一个命名空间。包括后面要讲到的DataController.js和D3Chart.js都会包装到这个Angello.Statistic的module中。
angular.module('Angello.Statistic', ['Angello.Common']);
2.创建页面和控制器
statistic.html
<div class="container chart-wrapper">
<h3>User Stories by Type~~~<span ng-model = 'statistic.style'></span>
123</h3>
<h3>{{statistic.style}}</h3>
</div>
StatisticController.js
angular.module('Angello.Statistic')
.controller('StatisticCtrl', function($scope){
var statistic = this;
statistic.style = "+++++++++++++++++++++++++";
});
3.添加路由
已经有了要显示的页面,并且statistic.html页面中绑定的变量已经在StatisticController中定义了,但是如果没有路由,我们还是没有办法访问到这个页面。所以需要添加路由,在angello.js文件中加入代码
.when('/statistic',{
templateUrl: 'src/angello/statistic/tmpl/statistic.html',
controller: 'StatisticCtrl',
requiresLogin: true,
})
在不涉及到指令的情况下,做好以上三步,基本就可以如愿的访问Statistis页面了(也就是显示一大串没有意义的“+++++++++++”)。但是这里有些小坑,有一个没填满,都不会出现理想中的界面。
(1)每个新建的js文件都要注册
我们新创建的控制器StatisticController.js需要到boot.js中注册,即加上一行
{ file: 'src/angello/statistic/controllers/StatisticCtroller.js'},
这样的StatisticController.js才是可用,反之如果注释这一行
就会看到下面的结果:
出现这样的结果说明了什么问题?
说明StatisticController控制器没有起到该起的作用,话句话说,就是StatisticController失效,所以需要注册到boot.js以激活使用
(2)controlleras参数的使用
如果你有读过Angello的代码,你就会发现,在angello的很多模块如users、storyboard等当中都是用了参数controllerAs
实验了上面步骤后发现页面是能够正常显示了,之后便渐渐靠近原先的设计,于是将users.html页面全部拷贝到statistic.html中,反复调试都不能像user模块那样显示出用户来,显示界面如下:
于是在Angello.js中将原先的路由改为:
.when('/statistic',{
templateUrl: 'src/angello/statistic/tmpl/statistic.html',
controller: 'StatisticCtrl',
controllerAs: 'users',
requiresLogin: true,
})
这样就可以正常显示user了。
为了弄清楚这个controllerAs参数的使用,将这里的controllerAs:'usesrs'改为了controllerAs:'users123'
同时将statistic.html对应的users也改成了users123,代码如下:
<div class="user-wrapper">
<form name="users123.userForm">
<table class="table edit">
<thead>
<tr>
<th width="40%">Name</th>
<th width="40%">Email</th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in users123.users">
<td>
<ng-form name="userNameForm">
<input required name="userName" type="text" class="form-control" ng-model="user.name" ng-blusersers1.updateUser(user.id, user)"/> <div class="error" ng-messages="userNameForm.userName.$error">
<div ng-message="required">
Please enter a name.
</div>
</div>
</ng-form>
</td>
<td>
<ng-form name="userEmailForm">
<input required name="userEmail" type="email" class="form-control" ng-model="user.email" ng-blur="users123.updateUser(user.id, user)"/> <div class="error" ng-messages="userEmailForm.userEmail.$error">
<div ng-message="required">
Please enter an email.
</div>
<div ng-message="email">
Email should be in format example@example.com
</div>
</div>
</ng-form>
</td>
<td>
<button type="button" class="btn btn-link"
ng-click="users123.removeUser(user.id)">Remove</button>
<a class="btn btn-link" href="#/users/{{user.id}}">View</a>
</td>
</tr>
</tbody>
</table>
</form> <div class="well">
<h4>Add User</h4> <form name="users123.newUserForm" class="form-inline new-user" role="form" novalidate ng-submit="users123.addUser()">
<div class="form-group">
<input required name="userName" type="text" class="form-control" ng-model="users123.newUser.name" placeholder="Name">
<div class="error" ng-messages="users123.newUserForm.userName.$error" ng-if="users123.showMessages('userName')">
<div ng-message="required">
Please enter a name.
</div>
</div>
</div>
<div class="form-group">
<input required name="userEmail" type="email" class="form-control" ng-model="users123.newUser.email" placeholder="Email">
<div class="error" ng-messages="users123.newUserForm.userEmail.$error" ng-if="users123.showMessages('userEmail')">
<div ng-message="required">
Please enter an email.
</div>
<div ng-message="email">
Email should be in format example@example.com
</div>
</div>
</div>
<button type="submit" class="btn btn-default">Add</button>
</form>
</div>
</div>
如此页面依然正常显示,从而得出结论:controllerAs设定的参数值一定要与页面中的变量同名,否则controllerAs参数失效。另外声明一点,通过使用controllerAs这个参数,避免了$scope的使用,使得在StatisticController.js中大幅减少了$scope的出现,简化了代码。
除此以外还有一些细节就不再一一说明,类似页面右上角的那个五角星图标,也就是要做的statistic模块的图标,其实用的是bootstrap的一个类class="glyphicon glyphicon-star",这也是在仿照其他三个图标时发现并在bootstrap库中选择的一个。所以说这些东西不需要背或记,甚至像我一样对此一无所知,但是需要的时候去查,查到了就用上即可。
今天主要讲了如何新建一个模块,从页面到控制器到路由,从页面不显示和不能全部正常显示到页面正常显示出预期的结果,明白了如何创建页面、配合控制器、设置路由等等,当然后面还会继续818如何做到文章开头那幅图的效果~~~
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。
友情赞助
如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。
1. 支付宝 2. 微信
AngularJS in Action读书笔记4(实战篇)——创建Statistic模块的更多相关文章
- AngularJS in Action读书笔记6(实战篇)——bug hunting
这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...
- AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
前言: "宁肯像种子一样等待 也不愿像疲惫的陀螺 旋转得那样勉强" 这是前几天在查资料无意间看到的一位园友的签名,看完后又读了两遍,觉得很有味道.后来一寻根究底才知这是出资大诗 ...
- AngularJS in Action读书笔记1——扫平一揽子专业术语
前(fei)言(hua): 数月前,以一个盲人摸象的姿态看了一些关于AngularJS的视频书籍,留下了我个人的一点或许是指点迷津或许是误人子弟的读后感.自以为已经达到熟悉ng的程度,但是因为刚入公司 ...
- AngularJS in Action读书笔记2——view和controller的那些事儿
今天我们来818<angularjs in action>的第三章controller和view. 1.Big Picture概览图 View是angularjs编译html后呈现出来的, ...
- AngularJS in Action读书笔记3——走近Services
试着想想这些问题:如果一个controller只关心自己所控制的view页面,那么对于整个application来说,你如何调用想要的function:如果controller从来都不会和其他cont ...
- AngularJS高级程序设计读书笔记 -- 指令篇 之 内置指令
1. 内置指令(10-12 章) AngularJS 内置超过 50 个内置指令, 包括 数据绑定,表单验证,模板生成,时间处理 和 HTML 操作. 指令暴露了 AngularJS 的核心功能, 如 ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- 【读书笔记】使用JMeter创建数据库(Mysql)测试
读书笔记:<零成本实现Web性能测试>第4章 记得某天按照虫师博客的写的,折腾后成功了.今天又忘记了... 折腾后又成功了,赶紧记录下... 原文:http://www.cnblogs.c ...
- AngularJS高级程序设计读书笔记 -- 大纲篇
零. 初衷 现在 AngularJS 4 已经发布了, 楼主还停留在 1.x 的阶段, 深感自卑. 学习 AngularJS 的初衷是因为, 去年楼主开始尝试使用 Flask 开发自动化程序, 需要用 ...
随机推荐
- IOS 跳转至AppStore的两种方式
//第一种方法 直接跳转 id+编号 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps: ...
- Rubinius 2.0 发布,Ruby 虚拟机
Rubinius 2.0 发布了,官方发行说明请看这里. Rubinius是一个运行Ruby程序的虚拟机,其带有Ruby的核心库. Rubinius的设计决定了其调试功能的强大,使得在运行时常规的Ru ...
- 小谈 - web模仿手机打电话与正则表达式
昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...
- 淘宝UWP--自定义图片缓存
一.应用场景 在淘宝应用首页,会有很多张图片,而这些首页图片不会经常改变,所以就需要缓存下来.这样就不必每次都从网络获取. 二.比较对象 1.系统缓存 对于系统缓存,我们不需要做什么处理.只需要把网络 ...
- RabbitMQ(五) -- topics
RabbitMQ(五) -- topics `rabbitmq`中的`topic exchange`将路由键和某模式进行匹配,从而类似于正则匹配的方式去接收喜欢的信息. topic exchange ...
- 分享一些Hadoop环境搭建所用到的软件
本来想用土的掉渣的语言说说hadoop配置的,因为最近总有人问我,环境搭建老出莫名其妙的问题,可是写到一半,还是决定不写了,网上教程好多好多,而大家遇到问题有很多是软件版本不对应造成的,因此我就把大家 ...
- Git学习笔记(7)——多人协作
本文主要记录了,多人协作时,产生冲突时的解决情况. 多人环境创建 首先我们需要模拟一个多人环境.前面的Git的学习都是在Ubuntu上面,现在我们也搭建一个win环境吧.安装win环境下的Git,很简 ...
- git 仓库、分支的区别
首先,要明白仓库的概念 仓库可以理解为repository, 就是存放代码的地方,—— 其实是一个比较笼统的概念,不管里面的内容,总之存放各种资源(代码.图片等等) 对于git应用开发者而已,本地一般 ...
- js 函数覆盖的问题
今天遇到奇怪问题是,一个html里面引入一个新的js进来后,原来的按钮点击后(假设触发onclick函数)在某个地方卡住了,不往下执行了.—— 之前都是好好的. 调试发现,在onclick中间某一处调 ...
- sigar
从http://sourceforge.net/projects/sigar/files/sigar/1.6/hyperic-sigar-1.6.4.zip/download下载sigar, 参照了h ...