angularjs + seajs构建Web Form前端(一)
简介
Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark Otto和Jacob Thornton合作开,是一个CSS/HTML框架。
AngularJS是Google 开源出来的一套 js 工具,为了克服HTML在构建应用上的不足而设计的,试图成为WEB应用中的一种端对端的解决方案,通过为开发者呈现一个更高层次的抽象来简化应用的开发,后面简称"ng"。
Seajs是一款优秀的模块开发插件,可以实现按需加载。
Bootstrap有自己的一套js库,但是为了防止与AngularJS产生兼容性的问题,我们不选择使用,只是使用它的css而已,因此这里我还要引入另外一个基于Bootstrap与AngularJS的UI组件--UI-Bootstrap,虽然该库提供的控件并不多,但是基本够用,而且可以参考它的代码来自己实现复杂的控件(后面的文章再讲)。
背景
当前Web前端开发中,我们已经可以很熟练的使用jQuery在对数据交互的时候来操作关联Dom的一些内容、样式等状态上的变化,然而很多的这些变化是代码重复的,虽然它并不复杂,但是有些确实需要大量的代码来进行操作;虽然jQuery为我们提供了大量的操作方式来减少复杂性,但是每次我们都要从页面中找寻一些相关的元素改变状态是重复且难以避免的,那么怎么样才能从这种重复的操作中解脱呢?
MVVM便可以让我们从这种重复的操作中解脱出来,简单的说MVVM就是我们将需要操作的元素与ViewModel进行绑定,当我们对ViewModel进行操作导致其状态发生变化的时候,与之相关的元素会自动发生变化。
由于我也使用jQuery开发了较长的时间,虽然前几年就已经有前端MVVM框架出现,却没有能让我觉得比原始方式更简单的,但是技术总是在发展的并趋向成熟,现在就可以将以上提到的3种框架进行结合,大大简化Web前端的开发(虽然需要一段时间的学习和适应),接下来就让我们一起来使用这3中框架进行开发吧(这里我不会对各个库有详细的介绍,有些地方仍然需要自己去学习)。
实现
首先我们从登录功能开始着手,登录界面比较简单,html代码如下:
<body class="container" ng-app="login">
<form name="frmLogin" class="col-sm-offset-4 col-sm-4" role="form" ng-controller="HomeLoginController">
<input name="txtName" ng-model="name" type="text" class="form-control input-lg" placeholder="请输入用户名" required autofocus />
<input name="txtPwd" ng-model="pwd" type="password" class="form-control input-lg" placeholder="密码" required />
<button class="btn-lg btn-primary btn-block" ng-click="submit()">登录</button>
<alert ng-repeat="a in alerts" type="a.type" close="closeAlert($index)">{{a.msg}}</alert>
</form>
</body>
这里不使用ngSubmit、ngShow、ngHide是因为有一些注意点需要讲解,登录的流程是当点击登录按钮的时候,如果用户名、密码未填写的情况下,会在登录按钮下面增加2个Alert提醒框,js代码如下:
angular.module('login', ['ui.bootstrap']);
function HomeLoginController($scope) {
$scope.alerts = [];
$scope.submit = function () {
if ($scope.frmLogin.txtName.$invalid)
$scope.alerts.push({ type: 'danger', msg: '用户名不能为空!' });
if ($scope.frmLogin.txtPwd.$invalid)
$scope.alerts.push({ type: 'danger', msg: '密码不能为空!' });
if ($scope.alerts.length)
return;
$scope.alerts = [{ type: 'success', msg: '登录成功' }];
};
$scope.closeAlert = function (index) {
$scope.alerts.splice(index, 1);
};
};
当用户名密码未填写或者表单正确的情况下,点击提交按钮的时候会出现以下2种情况,如图:


当我们点击X的时候(多次点击的时候会出现多个提示,别在意这个小问题,^_^),会调用closeAlert方法,并根据$index删除alerts数组内对应的元素,这时候绑定的视图就会自动刷新,不需要手动去操作这些元素,这里要注意的主要有3个地方:1、ng-app="login"是不能缺少的,除非你要手动启动ng;2、开头的angular.module('login', ['ui.bootstrap']);的意思是注册login模块且该模块需要对ui-bootstrap的引用(否则无法显示alert的效果);3、HomeLoginController方法的参数$scope是不能重命名成其他名字,否则ng会报错。
如果我们想要让弹出来的Alert自己消失怎么办呢?一开始的时候,大家可能会跟我一样,会尝试使用setTimeout函数去直接从$scope.alerts数组内将对应的元素移除掉,然后等待着视图将Alert移除掉,但是最后会发现一点作用都没有,因为视图数据是在ng内部进行控制的,需要使用它提供的机制去处理,视图才会跟着数据发生变化,这里需要使用$timeout去完成以上的操作,代码改动如下:
//其他代码略
$scope.submit = function () {
if ($scope.frmLogin.txtName.$invalid)
addAlert({ type: 'danger', msg: '用户名不能为空!' });
if ($scope.frmLogin.txtPwd.$invalid)
addAlert({ type: 'danger', msg: '密码不能为空!' });
if ($scope.alerts.length)
return;
addAlert({ type: 'success', msg: '登录成功' });
};
function addAlert(alert) {
$scope.alerts.push(alert);
$timeout(function () {
angular.forEach($scope.alerts, function (a, i) {
if (alert != a)
return;
$scope.alerts.splice(i, 1);
});
}, 500);
};
写到这里已经把大致该出现的效果都做出来了,现在的问题是这个脚本是直接写在页面上的,那么怎么样通过seajs来加载呢?这里就需要用到angular的手动加载模式了,首先需要对html进行修改要先将ng-app给移除掉,不然ng会自动加载,由于已经将脚本转移到js文件内了,无法找到HomeLoginController方法ng会抛出错误,使用seajs后的代码如下:
//页面
seajs.use('home-login'); //脚本文件
this.define(function (require, exports, module) {
angular.module('home.login', ['ui.bootstrap']).controller('HomeLoginController', function ($scope, $timeout) {
//原本HomeLoginController方法内的代码,这里就不重复贴出了
}); angular.bootstrap($('[name=frmLogin]'), ['home.login']);
});
从代码中可以看到首先要注册模块home.login这个名字是可以任意的,但是必须跟bootstrap内引用的模块对应,然后我们创建页面上需要的Controller(名字一样得对应),并使用ng的bootstrap来手动启动。
那么第一篇结合bootstrap + angularjs + seajs就到这里了,如果有任何错误请各位指出,谢谢,^_^!
angularjs + seajs构建Web Form前端(一)的更多相关文章
- bootstrap + angularjs + seajs构建Web Form前端2
bootstrap + angularjs + seajs构建Web Form前端(二) 回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操 ...
- bootstrap + angularjs + seajs构建Web Form前端(1)
bootstrap + angularjs + seajs构建Web Form前端(一) 简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark ...
- angularjs + seajs构建Web Form前端(二)
回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操作过程当中如何使用ui-bootstrap,继而完成简单功能后如何引入seajs后如何使n ...
- angularjs + seajs构建Web Form前端(三) -- 兼容easyui
回顾 在上一章中使用了angular实现了ajax form和树形结构,经过以上两章对于angular的大致使用,对于angular也有了初步的认识,接下来的内容只会对angular的一些用法做简单的 ...
- angularjs + seajs构建Web Form3
angularjs + seajs构建Web Form前端(三) -- 兼容easyui 回顾 在上一章中使用了angular实现了ajax form和树形结构,经过以上两章对于angular的大致使 ...
- seajs构建web申请书
随着开发项目的不断扩大,查找代码依赖关系复杂化,维护比较沉闷.记seajs有这种效果方面.果断尝鲜.解决两个问题:1)命名冲突 2)文件相关性 因为所在BG使用TAF服务,基于C++开发一套WSP w ...
- 移动端 Web 开发前端知识整理
文章来源: http://www.restran.net/2015/05/14/mobile-web-front-end-collections/ 最近整理的移动端 Web 开发前端知识,不定期更新. ...
- [web建站] 极客WEB大前端专家级开发工程师培训视频教程
极客WEB大前端专家级开发工程师培训视频教程 教程下载地址: http://www.fu83.cn/thread-355-1-1.html 课程目录:1.走进前端工程师的世界HTML51.HTML5 ...
- AngularJS从构建项目开始
AngularJS从构建项目开始 AngularJS体验式编程系列文章,将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀web前端框 ...
随机推荐
- highchart 设置双Y轴坐标 双x轴坐标方法
我们的图表一旦引入了两种不同单位或者数量级相差很大的数据以后,这时候需要两种坐标对其进行计量. 下面以设置双Y轴为例, y轴坐标的参数设置成: yAxis: [{ title: { text: '坐标 ...
- Cacti学习笔记一:基本安装和配置
1.安装依赖包 yum -y install net-snmp-devel mysql mysql-devel openssl-devel libtool 2.安装RRDTool yum -y ins ...
- 【Android】Android内存机制,了解Android堆和栈
1.dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native. 下面针对上面列出的数据类型进行说明,只有了解了我们申请的数 ...
- django with mysql (part-3)
step01: write second view-function vim views.py step02: configure your ( urls.py ) vim urls.py step0 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- Search-ADaccount
查询被锁定用户 Search-ADAccount -LockedOut | FT Name,ObjectClass -A Search-ADAccount Search-ADAccount Gets ...
- Android UI系列-----EditText和AutoCompleteTextView
在这篇随笔里将主要讲解一下EditText和AutoCompleteTextView这个控件 1.EditText 首先我们先简单来说说EditText这个控件,这个就相当于我们平常web开发中的文本 ...
- php中抓取网页内容的代码
方法一: 使用file_get_contents方法实现 $url = "http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru695114 ...
- Visual Studio 2013 prerequisites
http://www.visualstudio.com/zh-cn/products/visual-studio-ultimate-with-msdn-vs#Fragment_SystemRequir ...
- 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...