bootstrap + angularjs + seajs构建Web Form前端(1)
简介
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代码如下:
1<body class="container" ng-app="login">2<form name="frmLogin"class="col-sm-offset-4 col-sm-4" role="form" ng-controller="HomeLoginController">3<input name="txtName" ng-model="name" type="text"class="form-control input-lg" placeholder="请输入用户名" required autofocus />4<input name="txtPwd" ng-model="pwd" type="password"class="form-control input-lg" placeholder="密码" required />5<button class="btn-lg btn-primary btn-block" ng-click="submit()">登录</button>6<alert ng-repeat="a in alerts" type="a.type" close="closeAlert($index)">{{a.msg}}</alert>7</form>8</body>
这里不使用ngSubmit、ngShow、ngHide是因为有一些注意点需要讲解,登录的流程是当点击登录按钮的时候,如果用户名、密码未填写的情况下,会在登录按钮下面增加2个Alert提醒框,js代码如下:
angular.module('login',['ui.bootstrap']);functionHomeLoginController($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就到这里了,如果有任何错误请各位指出,谢谢,^_^!
bootstrap + angularjs + seajs构建Web Form前端(1)的更多相关文章
- bootstrap + angularjs + seajs构建Web Form前端2
bootstrap + angularjs + seajs构建Web Form前端(二) 回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操 ...
- angularjs + seajs构建Web Form前端(一)
简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark Otto和Jacob Thornton合作开,是一个CSS/HTML框架. Angula ...
- 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 ...
- 前端开发利器: Bootstrap + AngularJS
http://blog.csdn.net/conquer0715/article/details/51181391 概述 在HTML5盛行的互联网时代,涌现诸多的前端html/css/js框架,基于其 ...
- 移动端 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 ...
随机推荐
- Python输出文件由线解释和扩展的具体内容
结束此处的测试代码中作者写的,第一段包含不正确的版本号,后者是正确的版本号: #! /usr/bin/python2.7 try: filename = raw_input('please i ...
- JavaEE(3) - RMI服务器和客户端
1. 开发RMI服务器 Net Beans创建java project: (qs) (Server.java) package server; import java.rmi.*; //远程接口必须集 ...
- 一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header
一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header Wed Jun 03 03:31:24 CST 2015 Thread 1 adva ...
- 使用Maven管理Spring[转]
原文链接: Spring with Maven 原文日期: 2013年04月17日 翻译日期: 2014年06月29日 翻译人员: 铁锚 翻译原文连接:http://blog.csdn.net/ren ...
- Java有用的经验--Swing片
Java有用经验总结--Swing篇 前言 本文前言部分为我的一些感想,假设你仅仅对本文介绍的Java有用技巧感兴趣,能够跳过前言直接看正文的内容. 本文的写作动机来源于近期接给人家帮忙写的一个小程序 ...
- Contoso 大学 - 使用 EF Code First 创建 MVC 应用,实例演练
Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Contoso 大学是虚构的.应用包括了类似学生注册.课程创建以及教师分配等功能. 这个系 ...
- linux_redhat_线程后台运行方法
建议看完1:后直接看2 screen 方式熟练些可靠. 次方法适用于redhat系统,unbunt* 系统用screen 命令 产看系统版本 cat /proc/version 首先项目制作的sh文件 ...
- Zepto Code Rush 2014——Dungeons and Candies
题目链接 题意: k个点,每一个点都是一个n * m的char型矩阵.对与每一个点,权值为n * m或者找到一个之前的点,取两个矩阵相应位置不同的字符个数乘以w.找到一个序列,使得全部点的权值和最小 ...
- IOS中 init和initialize
一.init和initialize 1.方法类型 1> init属于对象方法,-开头 2> initialize属于类方法,+开头 2.调用时刻 1> init:每个对象初始化的时候 ...
- Java之IO转换流
直接上码: 读取键盘录入数据代码演示: import java.io.IOException; import java.io.InputStream; /** *读取键盘录入的数据,并打印在控 ...