天天看点

AngularJS 提交表单的方式 【已翻译100%】(1/2)

在angularjs出现之前,很多开发者就面对了表单提交这一问题。由于提交表单的方式繁杂而不同,很容易令人疯掉……然而现在看来,依然会让人疯掉。

今天,我们会看一下过去使用php方式提交的表单,现在如何将其转换为使用angular提交。使用angular来处理表单,对我而言,是一个“啊哈”时刻(译者:表示了解或发现某事物的喜悦)。即使它甚至都没有涉及多少angular表层的东西,但是它却帮助用户看到表单提交之后的潜力,并且理解两种数据绑定方式。

我们会使用jquery平台来进行这个处理过程。所以所要做的工作首先使用javascript。我们会提交表单,展示错误信息,添加错误类,并且在javascript中显示和隐藏信息。

之后,我们会使用angular。在使用之前,我们要做大部分所需的工作,并且我们之前所做的很多工作会非常容易。让我们开始吧。

仅使用jquery和ajax提交表单:如果你想看一篇完整的关于仅使用jquery和ajax提交表单的文章,请参见我们的另一篇文章:使用jquery提交表单的方式。

简单的表单

我们会关注两种提交表单的方式:

旧方法:jquery和php提交表单

新方法:angularjs和php提交表单

首先看一下我们的表单,超级简单:

AngularJS 提交表单的方式 【已翻译100%】(1/2)

形式要求

实现页面无刷新表单处理

输入姓名和超级英雄别名

如果有错误,显示错误提示

如果输入有误,将输入变成红色

如果所有内容ok,显示成功提示

文档结构

在我们的展示中,仅需两个文件

index.html

process.php

表单处理

让我们新建一个php来处理表单。该页面非常小并且使用post方式提交数据。

处理表单:这对我们来说并不是那么重要的。你可以使用其他你喜欢的语言来处理你的表单。

这是一个非常简单的表单处理脚本。我们仅检查数据是否存在,如果存在,则不做任何处理和操做;如果不存在,则需要向$errors数组中添加一条信息。

为了返回我们的数据用于ajax调用,我们需要使用echo和json_encode。这就是我们php表单处理所有需要做的操作。使用普通的jquery ajax或者angular处理表单也是这样的。

展示表单

让我们创建一个html来展示我们的表单

现在,我们有了表单。我们另外还使用了bootstrap来使表单看起来不是那么丑。使用bootstrap语法规则,每个input下含有一个spot来展示我们文本的错误信息。

AngularJS 提交表单的方式 【已翻译100%】(1/2)

使用jquery提交表单

现在,让我们来使用jquery处理表单提交。我会将所有的代码添加到空的

这里处理表单有不少的代码。我们有获取表单中变量的代码,有使用ajax将数据发送至我们的表单的代码,有检查是否有错和显示成功提示的代码。除此之外,我们希望每次表单提交之后,过去的错误信息都会被清除。确实是不少代码。

现在,如果表单中含有错误,则:

AngularJS 提交表单的方式 【已翻译100%】(1/2)

如果提交成功:

AngularJS 提交表单的方式 【已翻译100%】(1/2)

现在,让我们看使用angular来提交相同的表单。记住,我们不需要更改任何关于我们的php如何处理表单的内容,我们的应用依然会具备相同的功能(在同一个地方展示错误和成功信息)。

使用angular提交表单

我们准备在之前使用的

设置一个angular应用

步骤为:

看起来好像是很多内容,但是最终,我们会用非常少的代码,并且看起来会非常简洁。另外,创建带有更多输入更大的表单,也会更容易。

angular 组件和控制器

首先,加载angular并且新建组件和控制器

现在,我们有了angular应用的基础。我们已经加载了angular,创建了组件模块和控制器,并且将其应用于我们的网站。

接下来,我将展示双向绑定是如何工作的。

双向数据绑定

这是angular的核心思想之一,也是功能最强大的内容之一。在angular文档中,我们看到:“在angular网页应用中的数据绑定,是模型和视图层之间的数据自动同步。”这意味着,我们需要在表单中抓取数据,使用$('input[name=name]').val()并不是必需的。

我们在angular中将数据和变量绑定在一起,无论是javascript也好,view也罢,只要有改变,两者皆变。

为了演示数据绑定,我们需要获取表单的input来自动填充变量formdata。让我们回到应用于页面的angular控制器中。我们在过一下$scope和$http。

$scope:控制器和视图层之间的粘合剂。基本上,变量使用$scope从我们的控制器和视图层之间传递和往来。具体详细的定义,请参见文档。

$http:angular服务来帮助我们处理post请求。更多信息,请参见文档。

使用数据绑定获取变量

好了,闲话少说。我们将这些讨论应用到表单中去。方法比上面讨论的要简单。我们想angular控制器和视图中分别添加一行。

现在,我们已经建立了一个formdata对象。让我们用表单数据来填充它。在显示调用每个输入和获得val()之前,我们用ng-model绑定一个特殊的输入到变量。

现在,既然angular已经将每个输入绑到了formdata。 当你输入每个输入框,你可以看到formdata对象被填充了!有没有很酷!

你不必在view中使用$scope。一切被认为是嵌入到$scope中的。

处理表单

在我们的旧表单中,我们使用jquery提交表单,像这样$('form').submit()。现在我们使用angular称作ng-submit的特性。要想完成这个,我们需要添加一个控制器函数来处理表单,然后告诉我们form使用这个控制器函数:

现在我们的form知道提交时使用控制器函数了。既然已经到位了,然我们用$http来处理表单吧。

处理表单的语法看起来跟原始方式很像。好处是我们不需要手动抓取表单数据,或者注入,隐藏,添加类显示错误或成功信息。

这就是我们的表单!没有添加或移除类。我们需要每次提交表单时都清楚错误。我们只需绑定变量和需要用到的视图。这非常棒,因为处理器用来处理数据,而视图用来显示数据.

jquery post vs angular post

有时能看到用post方式提交在服务器中看不到数据,这是因为jquery和angular的序列化和发送数据的方式不同。这归结于你所使用的服务器语言和它理解angular提交的数据的能力。

上面的代码是应用于php服务器的,jquery对于$.param函数则是必需的。虽然实现上文中提到的内容有非常多不使用jquery的方法,但在本实例中,使用jquery的唯一原因就是,它更简单。

下面简洁的语法将会基于你服务器端语言来工作。更多关于angularjs ajax调用的信息,欢迎阅读这篇非常棒的文章:make angularjs $http service behave like jquery ajax