咱们准备在以前使用的<script>标签中设置咱们的Angular应用。因此删除里面的内容,咱们就能够开始了。javascript
步骤为:php
1. 加载Angularhtml
2. 设置modulejava
3. 这是controllerjquery
4. 将module和controller应用于HTMLangularjs
5. 设置双向变量绑定ajax
6. 这是错误和信息api
看起来好像是不少内容,可是最终,咱们会用很是少的代码,而且看起来会很是简洁。另外,建立带有更多输入更大的表单,也会更容易。服务器
Angular 组件和控制器app
首先,加载Angular而且新建组件和控制器
<!-- index.html --> ... <!-- LOAD JQUERY --> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <!-- LOAD ANGULAR --> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script> <!-- PROCESS FORM WITH AJAX (NEW) --> <script> // define angular module/app var formApp = angular.module('formApp', []); // create angular controller and pass in $scope and $http function formController($scope, $http) { } </script> </head> <!-- apply the module and controller to our body so angular is applied to that --> <body ng-app="formApp" ng-controller="formController"> ...
如今,咱们有了Angular应用的基础。咱们已经加载了Angular,建立了组件模块和控制器,而且将其应用于咱们的网站。
接下来,我将展现双向绑定是如何工做的。
这是Angular的核心思想之一,也是功能最强大的内容之一。在Angular文档中,咱们看到:“在Angular网页应用中的数据绑定,是模型和视图层之间的数据自动同步。”这意味着,咱们须要在表单中抓取数据,使用$('input[name=name]').val()并非必需的。
咱们在Angular中将数据和变量绑定在一块儿,不管是JavaScript也好,view也罢,只要有改变,二者皆变。
为了演示数据绑定,咱们须要获取表单的input来自动填充变量formData。让咱们回到应用于页面的Angular控制器中。咱们在过一下$scope和$http。
$scope:控制器和视图层之间的粘合剂。基本上,变量使用$scope从咱们的控制器和视图层之间传递和往来。具体详细的定义,请参见文档。
$http:Angular服务来帮助咱们处理POST请求。更多信息,请参见文档。
好了,闲话少说。咱们将这些讨论应用到表单中去。方法比上面讨论的要简单。咱们想Angular控制器和视图中分别添加一行。
<!-- index.html --> ... <!-- PROCESS FORM WITH AJAX (NEW) --> <script> // define angular module/app var formApp = angular.module('formApp', []); // create angular controller and pass in $scope and $http function formController($scope, $http) { // create a blank object to hold our form information // $scope will allow this to pass between controller and view $scope.formData = {}; } ...
如今,咱们已经创建了一个formData对象。让咱们用表单数据来填充它。在显示调用每一个输入和得到val()以前,咱们用ng-model绑定一个特殊的输入到变量。
<!-- index.html --> ... <!-- FORM --> <form> <!-- NAME --> <div id="name-group" class="form-group"> <label>Name</label> <input type="text" name="name" class="form-control" placeholder="Bruce Wayne" ng-model="formData.name"> <span class="help-block"></span> </div> <!-- SUPERHERO NAME --> <div id="superhero-group" class="form-group"> <label>Superhero Alias</label> <input type="text" name="superheroAlias" class="form-control" placeholder="Caped Crusader" ng-model="formData.superheroAlias"> <span class="help-block"></span> </div> <!-- SUBMIT BUTTON --> <button type="submit" class="btn btn-success btn-lg btn-block"> <span class="glyphicon glyphicon-flash"></span> Submit! </button> </form> <!-- SHOW DATA FROM INPUTS AS THEY ARE BEING TYPED --> <pre> {{ formData }} </pre> ...
如今,既然Angular已经将每一个输入绑到了formData。 当你输入每一个输入框,你能够看到formData对象被填充了!有没有很酷!
你没必要在view中使用$scope。一切被认为是嵌入到$scope中的。
在咱们的旧表单中,咱们使用jQuery提交表单,像这样$('form').submit()。如今咱们使用Angular称做ng-submit的特性。要想完成这个,咱们须要添加一个控制器函数来处理表单,而后告诉咱们form使用这个控制器函数:
<!-- index.html --> ... <!-- PROCESS FORM WITH AJAX (NEW) --> <script> // define angular module/app var formApp = angular.module('formApp', []); // create angular controller and pass in $scope and $http function formController($scope, $http) { // create a blank object to hold our form information // $scope will allow this to pass between controller and view $scope.formData = {}; // process the form $scope.processForm = function() { }; } ... <!-- FORM --> <form ng-submit="processForm()"> ...
如今咱们的form知道提交时使用控制器函数了。既然已经到位了,然咱们用$http来处理表单吧。
处理表单的语法看起来跟原始方式很像。好处是咱们不须要手动抓取表单数据,或者注入,隐藏,添加类显示错误或成功信息。
<!-- index.html --> ... // process the form $scope.processForm = function() { $http({ method : 'POST', url : 'process.php', data : $.param($scope.formData), // pass in data as strings headers : { 'Content-Type': 'application/x-www-form-urlencoded' } // set the headers so angular passing info as form data (not request payload) }) .success(function(data) { console.log(data); if (!data.success) { // if not successful, bind errors to error variables $scope.errorName = data.errors.name; $scope.errorSuperhero = data.errors.superheroAlias; } else { // if successful, bind success message to message $scope.message = data.message; } }); }; ...
这就是咱们的表单!没有添加或移除类。咱们须要每次提交表单时都清楚错误。咱们只需绑定变量和须要用到的视图。这很是棒,由于处理器用来处理数据,而视图用来显示数据.
jquery POST vs Angular POST
有时能看到用POST方式提交在服务器中看不到数据,这是由于jQuery和Angular的序列化和发送数据的方式不一样。这归结于你所使用的服务器语言和它理解Angular提交的数据的能力。
上面的代码是应用于PHP服务器的,jQuery对于$.param函数则是必需的。虽然实现上文中提到的内容有很是多不使用jQuery的方法,但在本实例中,使用jQuery的惟一缘由就是,它更简单。
下面简洁的语法将会基于你服务器端语言来工做。更多关于AngularJS AJAX调用的信息,欢迎阅读这篇很是棒的文章:Make AngularJS $http Service Behave Like jQuery AJAX
这个例子是以字符串的方式发送数据,而且发送你的头信息。若是你不须要这些,而且但愿Angular 的$http POST尽量的简洁,咱们可使用简写方法:
...
$http.post('process.php', $scope.formData)
.success(function(data) {
...
});
...
绝对更简洁更容易记住方法。
$http 内部控制器: 理想的,你能够将$http请求从controller移除到 service.这只是为了演示目的,咱们将会尽快在service上进行讨论.
咱们将使用指令ng-show和ng-class来处理咱们的视图,Angular双方括号容许咱们将变量放置在咱们须要的地方。
ng-show: 根据变量值是否存在来显示或隐藏元素. 文档
ng-class: 根据变量值是否存在(或一些其余表达式)来添加或移除类. 文档
<!-- index.html --> ... <!-- SHOW ERROR/SUCCESS MESSAGES --> <div id="messages" ng-show="message">{{ message }}</div> <!-- FORM --> <form> <!-- NAME --> <div id="name-group" class="form-group" ng-class="{ 'has-error' : errorName }"> <label>Name</label> <input type="text" name="name" class="form-control" placeholder="Bruce Wayne"> <span class="help-block" ng-show="errorName">{{ errorName }}</span> </div> <!-- SUPERHERO NAME --> <div id="superhero-group" class="form-group" ng-class="{ 'has-error' : errorSuperhero }"> <label>Superhero Alias</label> <input type="text" name="superheroAlias" class="form-control" placeholder="Caped Crusader"> <span class="help-block" ng-show="errorSuperhero">{{ errorSuperhero }}</span> </div> ...
咱们的表单完成了!经过强大的Angular,咱们能够将这些愚蠢的显示/隐藏的js代码逻辑从视图中移走 了。如今咱们的js文件只用来处理数据,而且视图能够作它本身的事情了。
咱们的类和错误/成功等提示信息将在可获取时显示而不可获取时隐藏。当咱们无须再像使用老的javascript那样担忧是否已经考虑全面,这变得更加容易。你也无须再担忧是否记得隐藏每处form提交时的那些错误信息。
Angular表单验证 获取更多表单验证的信息,请研读咱们另外一文章:AngularJS Form Validation。
如今咱们已把美观的表单所有转变为Angular的了。咱们共同窗习了许多概念,但愿你与它们接触更多,它们也将更易用。
回顾:
建立一个Angular module
建立一个Angular controller
双向数据绑定
ng-model绑定inputs
ng-click提交表单
使用双向数据绑定展现表单错误
展现一个基因而否变量存在的div
添加一个基因而否变量存在的类
这些Angular技术将在更庞大的应用中使用,你能够用它们建立许多好东西。祝Angular之途愉快,敬请期待更多深刻的文章。同时,你也能够经过深刻了解其指南,服务和厂商等来继续学习Angular。