标签:
最近公司在搞新项目,web端采用的是angularJS ,关于angularJS是什么以及它的基本用法我这里不做过多解释,因为之后如果要写的话,再一点点的去讲,新人接触ng都会被它的一些概念所弄的迷糊,我也是刚接触几天才把ng中的一些概念他们之间的关系搞清楚,这里我可能说的有些不正确,也请见谅并指正。本文主要通过一个实际案例给大家讲清楚关于模块,控制器,服务,指令等他们之间的关系,并完成一个登录的功能。
首先需要说的是angularJS中是一款基于MVC的前端框架,MVC就是控制器,视图,数据模型的概念,在我们用struts的时候,数据模型其实就是我们定义在action中的javabean或者字段,视图就是jsp或者html 而控制器就是我们的action,这样他们各司其职共同完成MVC,同理在angularJS中也做了MVC的分解,这是和jquery相比一个比较大的区别,但是我不认为jquery没有MVC,只是我们平时的开发中并没有类似的开发习惯,jquery没有天然的提供这种开发模式所以我们才忽视了,angular提供了这些天然的支持。在angularJS中,控制器是完成一些基本的获取信息,跳转,调用等工作,在控制器中我们会操作model,操作model就等于操作scope,所谓scope我理解的就是用来存储数据的一个对象,就好比struts我们用的request对象session对象,而applcation对象就等于angular中的rootScope对象。视图就是html,在html中我们会引入一些公用的组件例如表单,列表,下拉框等,这些ui组件我们通常会使用easyui,在angular中,我们会用指令进行封装,当然angular提供了一些内置的指令。
这么说还有一些乱,简单来说就是,用户看到 使用了指令的视图,通过操作指令将数据参数传递给了控制器,控制器从scope中获取相关参数后,调用服务完成具体业务逻辑。
另外还有两个概念我们细说,1是模块,2是服务。 模块我理解的就是一个包,它将一类具体操作(指令,控制器,服务)做了封装。再我们想使用某个指令或者控制器的时候只要引入这个模块(包)就可以了。当然一个模块的定义不只说非要包含这些东西,它可以单独就包含指令,或者就包含控制器,或者就包含服务,例如
<pre name="code" class="javascript">// 定义相关模块
window.routeModule = angular.module('msd.routes',['ngRoute']);
window.serviceModule = angular.module('msd.services', ['ngResource']);;
window.controllerModule = angular.module('msd.controllers', ['msd.services']);
window.diretiveModule = angular.module('msd.directives', ['msd.services', 'msd.controllers']);
window.filterModule = angular.module('msd.filters', []);
window.cookieModule = angular.module('msd.cookies', ['ngCookies']);以上都是一些基本的常识。具体的细节我们之后再说。下面来看一个登录的demo。
首先我们需要引入一些angular的lib,因为我们的demo很简单,所以就引入了一个js:
<script type="text/javascript" src="../../../lib/angular/angular.js"></script>
<script type="text/javascript" src="../controller/controller.js" ></script> <script type="text/javascript" src="../directive/directive.js" ></script> <script type="text/javascript" src="../service/loginService.js" ></script>
首先我们来看login.html文件:页面很简单除了引入的一些js文件外,我们只写了一行指令的代码,而这个plus-user-form就是一个我们自定义的指令,它是一个ui组件。
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<title>登录</title>
<meta charset="UTF-8">
<script type="text/javascript" src="../../../lib/angular/angular.js"></script>
<script type="text/javascript" src="../controller/controller.js" ></script>
<script type="text/javascript" src="../directive/directive.js" ></script>
<script type="text/javascript" src="../service/loginService.js" ></script>
</head>
<body>
<div>
<plus-user-form></plus-user-form>
</div>
</body>
</html>
var myApp = angular.module('myApp',[]); //这行代码就是指利用angular提供的module方法创建了一个名为myApp的模块,[]应该是依赖的模块或者服务。
在这个模块里,首先我们来创建一个控制器,创建控制器的代码如下,也是在controller.js文件里:
myApp.controller("loginController",function($scope,$location,$window,LoginService){
$scope.login = function () {
if (!$scope.username) {
console.log("请输入用户名");
return;
}
if (!$scope.password) {
console.log("请输入密码");
return;
}
LoginService.loginDo({
'username': $scope.username,
'password': $scope.password
}).then(function (data) {
if (data == null) {
console.log("登录异常");
} else {
if (200 == data) {
console.log("登录成功");
$window.location.href = "http://www.baidu.com";
} else {
console.log("失败");
$window.location.href = "http://www.damai.cn";
}
}
});
};
});var myApp = angular.module('myApp');
myApp.factory("LoginService",function($http,$q){
return {
loginDo: function(httpParams){
var deferred = $q.defer();
$http({
method:"post",
url: "/angular-war/loginServlet",
params:httpParams
}).success(function(data, status) {
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject(null);
});
return deferred.promise;
}
};
});通过调用 $q.defer() 可以构建一个新的 deffered 实例。 deffered 对象用来将 Promise 实例与 标记任务状态(执行成功还是不成功)的 API 相关联。 deffered 对象的方法 resolve(value) ——传入 value 解决派生的 promise。 如果 value 是一个通过 $q.reject 构造的拒绝对象(rejection) , 该promise 将被拒绝。 reject(reason) ——拒绝派生的promise,并提供原因 。 这相当于通过 $q.reject构造的拒绝对象(rejection)作为参数传递给 resolve。 notify(value) ——在 promise 执行的过程中提供状态更新。 这在 promise 被解决或拒绝之前可能会被多次调用。
姑且先防着,之后再说。然后我们通过post或者get方法调用了服务器的接口并将结果返回给控制器。
ok,控制器和服务我们都看过了,模块也知道怎么回事了,页面咱们也看了,就剩下指令了,指令directive刚才说了,可以理解为一个 UI组件,本身angularJS提供了一些内置的指令但也提供了自定义指令的API,这样可以让全世界的人民都来封装优秀的指令供大家使用。这里我们只是为了演示所以就随便写了写,打开direcitve.js文件,代码如下:
var myApp = angular.module("myApp");
myApp.directive('plusUserForm', function () {
return {
restrict: "E",
replace: true,
templateUrl: '/angular-war/resource/js/login/html/plusUserForm.html'
};
});<form name="userForm" method="post" ng-controller="loginController">
<input name="username" type="text" placeholder="请输入用户名" ng-model="username" required />
<input name="password" type="text" placeholder="请输入密码" ng-model="password" required />
<a ng-click="login()">登录</a>
</form>
OK 这样整个流程我们就说了一遍。最后我们看下后台的代码怎么写的,为了方便我写了一个servlet,代码如下:
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username:"+username+",password:"+password);
PrintWriter printWriter = resp.getWriter();
printWriter.print(200);
printWriter.flush();
printWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输入用户名和密码后点击登录,页面重定向到了baidu页面,这样我们的demo就做完了。
之后如果有时间我再整理其他的相关知识然后分享给大家。
标签:
原文地址:http://blog.csdn.net/qq522935502/article/details/45059877