第三章 AngularJS与MVC

一、AngularJS中的MVC
目前普遍认为AngularJS是一款MVW(Model-View-Whatever)框架,这个是因为AngularJS早期比较接近于MVC,随着新版本代码的重构与API的改进,$scope对象可以认为是由一个方法(Controller)包装后的ViewModel,看上去更接近于MVVM,那么到底是MVC还是MVVM呢?怎么样都行(whatever),这就是MVW的由来
AngularJS中的MVC:
Model :作用域对象中的属性
View :DOM元素,即HTML页面
Controller :用户自定义的构造方法,作用域中的模型数据可以通过依赖注入的方
式注入控制器中
1.控制器的定义
AngularJS的控制器是一个构造方法,可以使用模块实例的 controller(name,func) 方法来声明一个控制器,该方法接收两个参数,第一个参数是控制器名字,第二个参数是控制器的 构造函数
--------------------------------------------------------------------------------------------------------------------
<script type="text/javascript">
var app= angular.module("app",[]) ;
app. controller ("LoginController",function( $scope , $log ){
$scope.name="admin";
$scope.pword="123456";
});
</script>
--------------------------------------------------------------------------------------------------------------------
AngularJS框架会在window对象中增加了一个全局的angular对象,可以通过调用 angular 对象的 module("app",[]) 方法来得到一个模块实例(此处的"app"参数是在页面中
ng-model 指令的值),然后再调用模块实例的 controller(name,func) 方法
$scope $log $scope 是作用域对象,是控制器与视图之间传递信息的载体; $log 为AngularJS框架内置的日志服务对象,用于向控制台输入日志信息,当为控制器构造方法指定这两个参数后,控制器实例化时会把这两个对象注入控制器中
2.控制器对象的实例化
ng-controller 指令的使用方法与 ng-app 指令类似,也是作为标签的扩展属性使用
AngularJS框架遇到 ng-controller 指令时会根据 ng-controller 指令指定的控制器名称查找控制器构造方法,然后使用对应的构造方法实例化控制器对象,并将控制器依赖的对象注入控制器对象中
ng-controller 指令支持通过 as 语法指定控制器对象的名称,需要注意的是,当指令控制器名称并通过该名称来调用方法时,所调用的方法是控制器对象本身的方法而不是 $scope 作用域的方法,需要在控制器构造函数中通过 this 来定义
--------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html ng-app ="app">
<head>
<meta charset="utf-8">
<title>angularjs</title>
<script type="text/javascript" src="./angular.min.js"></script>
</head>
<body ng-controller ="CalcController as calc">
<div>单价:<input type="number" ng-model ="price"/></div></br>
<div>数量:<input type="number" ng-model ="num"/></div></br>
<div>总价:{{calc.totalPrice()}}</div>
<script type="text/javascript">
function CalcController( $scope ){
$scope.price=10;
$scope.num=1;
this .totalPrice=function(){
return $scope.price*$scope.num;
}
}
var app=angular. module ('app', [])
app. controller ("CalcController",CalcController);
</script>
</body>
</html>
--------------------------------------------------------------------------------------------------------------------
控制器对象实例化时,AngularJS会创建一个新的作用域对象 $scope ,然后会把 $scope 注入到控制器对象中
通过 ng-model 指令,在 $scope 和input之间建立数据绑定

三、控制器的作用域范围
一个页面可以使用多个 ng-controller 指令来实例化不同的控制器对象,但是每个控制器对应的作用域对象只能与 ng-controller 指令所在的标签的开始标签与结束标签之间的DOM元素建立数据绑定
--------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html ng-app ="app">
<head>
<meta charset="utf-8">
<title>angularjs</title>
<script type="text/javascript" src="angular.min.js"></script>
</head>
<body>
<div ng-controller ="UserController" style="border:#ccc solid 1px;">
用户名:<input type="text" ng-model ="name" placeholder="用户名"/>
密码:<input type="password" ng-model ="pword" placeholder="密码"/>
<button>提交</button>
<p>您输入的用户名:{{name}}</p>
<p>您输入的密码:{{pword}}</p>
</div>
<div ng-controller ="InfoController" style="border:#ccc solid 1px;">
个人爱好:<input type="text" ng-model ="love" placeholder="个人爱好"/>
<p>您输入的个人爱好:{{love}}</p>
</div>
<script type="text/javascript">
function UserController( $scope , $log ){
$scope.name="admin";
$scope.pword="1";
$log.info("UserController->name:"+$scope.name);
$log.info("UserController->pword:"+$scope.pword);
}
function InfoController( $scope , $log ){
$scope.love="足球";
$log.info("InfoController->name:"+$scope.name);
$log.info("InfoController->pword:"+$scope.pword);
$log.info("InfoController->love:"+$scope.love);
}
var app=angular. module ("app",[]);
app. controller ("UserController",UserController);
app. controller ("InfoController",InfoController);
</script>
</body>
</html>
--------------------------------------------------------------------------------------------------------------------

四、控制器中处理DOM事件
AngularJS提供了一系列的事件绑定指令,这些指令是在原生的JavaScript事件名称前增加" ng- "前缀,如: ng-click ng-keyup
--------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html ng-app ="app">
<head>
<meta charset="utf-8">
<title>angularjs</title>
<script type="text/javascript" src="angular.min.js"></script>
</head>
<body>
<div ng-controller ="UserController" style="border:#ccc solid 1px;">
用户名:<input type="text" ng-model ="name" placeholder="用户名"/>
密码:<input type="password" ng-model ="pword" placeholder="密码"/>
<button ng-click ="login()">提交</button>
<script type="text/javascript">
function UserController( $scope ){
$scope .login=function(){
if( $scope.name =="admin"&& $scope.pword =="admin"){
alert("登陆完成");
}else{
alert("登录失败:请输入正确账户密码");
}
}
}
var app=angular. module ("app",[]);
app. controller ("UserController",UserController);
</script>
</div>
</body>
</html>
--------------------------------------------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/qq_28238383/article/details/80265961