3.1将AngularJS放入上下文
本章,作者将AngularJS放在全球web app开发的上下文里,并为后面的章节设置功能。AngularJS的目标,是带来一款工具,它有服务端开发web client的能力,并易于开发,测试,富、复杂的web应用。
1、理解AngularJS擅长什么
AngularJS不是任何问题的解决方案。AngularJS的不同种类的功能,只适用于服务端开发人员,从浏览器中浏览。这意味着每次HTML文档被AngularJS加载后,都做了很多工作——HTML元素不得不被编译,数据绑定不得不被计算,指令需要被执行,等等。
这类工作要花费时间去执行,而时间的长短,取决于HTML文档的复杂度、关联的JavaScript代码、浏览器的质量、设备处理器的能力。你在最新的浏览器,性能好的桌面电脑上,没有感觉到任何延迟。但在动力不足的智能电话的老浏览器里,AngularJS app的初始化设置会很慢。
所以,当它执行时,设置要尽可能少,为用户提供尽可能多的app。这意味着,要关心你构建的web 应用的类型。这里有两种类型的web应用:round-trip和single page。
1.1、理解Round-Trip和Single-Page应用
很长一段时间,Web apps基于Round-Trip模型开发。浏览器从服务器请求一个初始HTML文档。用户交互——如点击一个link活提交一个表单——导致浏览器请求并接收一个完整的新的HTML文档。在该类型的应用中,浏览器必须渲染引擎HTML内容,和所有的应用逻辑和服务器上的数据。浏览器做一系列没有状态的HTTP请求,服务器通过动态生成HTML文档来响应处理。
很多当前的web开发,依然是round-trip应用,这是因为他们从浏览器中需求的少,确保广泛的客户端的支持。但这里有一系列的缺点:下个HTML文档被请求和加载期间,他们让用户等待。他们需要一个大型的服务端架构,来处理所有的请求和应用状态消息。他们需要大量宽带,因为每个HTML文档都是自包含(导致服务器的相应中,包含大量相同内容)的。
Single-page应用,使用不同的途径。一个初始化HTML文档发送到浏览器,但用户交互导致Ajax请求,用少量的HTML或数据,代替用户正在浏览的一些元素。该初始化HTML文档,永远都不被重载或替换。当Ajax请求以异步方式执行,用户可以继续和现有HTML交互,顶多看到一个"Data loading"的消息。
AngularJS擅长single-page应用,并且尤其是复杂的round-trip应用。对于简单的项目,jQuery可能是一个更好的选择。
现代web app项目的发展趋势,是朝着single-page应用模型。
1.2AngularJS和jQuery
在Web app开发上,AngularJS和jQuery有不同的途径。jQuery所有的都是关于精确操作浏览器的DOM,来创建一个应用。而AngularJS的途径,是将浏览器编程应用开发的功能。
使用jQuery,难于编写和管理大型应用,单元测试也成为挑战。
作者喜欢使用AngularJS的一个原因是,它基于jQuery的核心功能构建。事实上,AngularJS包含一个叫做jqLite的JQuery的删减版本,在写自定义指令时使用(作者会在第15-17章讲)。如果你将jQuery添加到HTML文档,AngularJS会自动检测它,并优先使用jQuery而不是jqLite。
AngularJS的主要缺点,是前期开发时间的投资,这是基于MVC开发的共同点。然而,对于复杂app或要使用重大修改或维护的,这样的初始化投资是值得做的。
索引,简而言之,jQuery适用于低复杂度的web app,不需要单元测试,你立即需要结果。jQuery对于增强round-trip web apps的HTML也不错(用户的交互会导致新的HTML文档被加载),因为你能简单地应用jQuery,而不需要修改server生成的HTML内容。AngularJS适用于更复杂的single-page web apps,当你有时间关心设计和计划,并且能使用容易地控制server 生成的HTML。
2、理解MVC模式
没啥说的,自己看吧。
3、理解RESTful服务
在AngularJS apps中,领域模型的逻辑,总是在客户端和服务端分裂的。服务端包含持久存储,典型地是一个数据库,并包含管理它的逻辑。在SQL数据库的情况下,例如,必须的逻辑会包括打开数据库服务器的连接,执行SQL查询,处理结果发送给客户端。
我们不想客户端代码直接访问数据存储,那样会在客户端和数据存储之间建立紧密的耦合。在不改变客户端代码的情况下,会导致难于单元测试,难于改变数存储。
通过使用服务来间接地访问数据存储,我们防止紧密耦合。客户端的逻辑响应得到的数据,而不知道数据存储的细节或访问背后发生的事情。
这里有很多方式,能在客户端和服务端之间传递数据。最公共地,是使用AJAX请求,调用服务端代码,服务端发送JSON。
这是RESTful web 服务的基本功能,能使用原生HTTP请求,在数据上执行create,read,update,delete操作。
注意:REST是一种API类型。至于作者,JSON服务就是RESTful。
在一个RESTful web service,操作的请求,通过URL+HTTP方法名这样的方式表达。例如,
http://myserver.mydomain.com/people/bob |
RESTful web service没有标准的URL定义,但是有一点,url应该能不解自明。例子中,有一个数据对象的集合叫做people,集合中有一个对象的唯一标识,是bob。
提示:在一个真实的项目中,并不总是能创建一个不言而喻的URLs,但你能做一系列的努力,保持事情简单,并没有通过URL暴露数据存储的内部结构(因为这是另一种组件间的耦合)。保持你的URLs尽可能地简单清晰,确保在服务端进行URL格式和数据存储结构之间的映射。
URL标识我要操作的数据对象,HTTP方法指定我要执行哪种操作。
Method |
Description |
GET |
通过URL获取指定的数据对象 |
PUT |
通过URL更新指定的数据对象 |
POST |
创建一个新的数据对象 |
DELETE |
通过URL删除一个数据对象 |
你不是必须使用表中的方法,来执行操作。POST方法,经常有双重身份,数据存在就更新,数据不存在就创建。意味着PUT方法没有使用。作者将在第20章解释AngularJS对Ajax的支持。在21章用RESTful工作。
3.1等幂HTTP方法
自己看吧。
4、公共的设计陷阱
在本节,作者描述三个他在AngularJS项目中,遇到过的公共设计陷阱。这里没有代码错误,相反地。。。。
4.1将逻辑放在错误的位置
最公共的问题,是将逻辑放在错误的组件:
- 将业务逻辑放在视图,而不是控制器
- 将领域逻辑放在控制器,而不是模型
- 当使用RESTful服务时,将数据存储逻辑放在客户端模型
这种情况下,应用照常运行,但一段时间后,将变得难以增强和维护。
这里有三个准则:
- 视图逻辑应该准备要显示的数据,但永远不要修改model。
- 控制器逻辑应该永远直接从model中,create,update,delete数据。
- 客户端永远不要直接访问数据存储。
4.2采用数据存储数据格式
在一个良好设计的AngularJS应用中,从RESTful服务中获取数据,服务器的这项工作,会隐藏数据存储的实现细节,客户端使用适合的数据格式。决定客户端如何表现数据,例如,确保你使用数据存储的格式,如果数据存储不能原生地支持该格式,这是服务器执行翻译的工作。
4.3执着于旧的方式
AngularJS最强大的特性之一,是它基于jQeury,特别是他的命令特性,作者将在第15章描述。现在的问题是,想象使用AngularJS简单,但最终使用在后台使用jQeury。
可可能看起来不像设计问题,但是jQeury不能简单地分离MVC组件,它使得测试,增强,维护都变得困难。如果你在AngularJS app中,直接从jQeury操作DOM,你就会有这个问题。
你要决定使用AngularJS,你就要确保你不会退回到jQuery的方式。在第十五章,作者介绍jqLite时,会返回该话题。
3.1将AngularJS放入上下文的更多相关文章
- WPF Prism MVVM 中 弹出新窗体. 放入用户控件
原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- tuple放入dict中
tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...
- ios-将代码创建的视图控件放入拖拽控件的下面
如图所示 图片是拖拽上去的imageView,橘黄色控件是在代码中创建的添加上去的,此时黄色view在imageView 上方 调用方法bringSubviewToFront:试图将imageView ...
- java通过文件路径读取该路径下的所有文件并将其放入list中
java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...
- 将DLL放入到资源中,运行时自动加载
今天在看到 一个小软件,考勤用的 AttendanceSheet_V_1_2,只有一个EXE文件,绿色的随便考到哪里都可以运行. 顺手反编译后发现,他将需要的DLL也放入到资源文件了,在启动的时候自动 ...
- 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可
- 将插入的新行放入dataGridView的第一行
将插入的新行放入dataGridView的第一行 习惯这样用的: dataGridView1.Rows.Add(dataRow);改成:dataGridView1.Rows.Insert(0,data ...
- LinuxC语言读取文件,分割字符串,存入链表,放入另一个文件
//file_op.c #include <string.h> #include <stdio.h> #include <stdlib.h> struct info ...
随机推荐
- Android 脚本替换PackageName
原文简书地址:http://www.jianshu.com/p/dca9c323c686 1 前言 平时如果想要替换包名一般是在AS中右键Rename进行操作.但是如果遇到一份代码希望导出几种不同的包 ...
- jboss4.2.3禁用http put/delete等请求
在应用的web.xml中配置如下信息: <security-constraint> <web-resource-collection> <web-resource-nam ...
- Ninject简单的Demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Spring Boot 1 创建Demo
Spring Boot的主要优点: 为所有Spring开发者更快的入门 开箱即用,提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XML配置的要求 入门操作: 1.打开ht ...
- Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...
- category应用(计算nssting的数量)
// // main.m // 03-分类应用 // // Created by apple on 14-3-18. // Copyright (c) 2014年 apple. All rig ...
- iOS UICollectionView之二(垂直滚动)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- 在Hyper-V的虚拟机中使用无线网络
今天在WINDOWS 8.1中装了WINDOWS 7的虚拟机,但默认情况下只能共享有线网络,而没有无线网络. 解决方法: http://www.elmajdal.net/Win2k8/Enabling ...
- MVC字符串处理及MVC @RenderSection小计
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 最近在做自学MVC,遇到的问题很多,索性一点点总结 ...
- 理解v$sql的exact_matching_signature与force_matching_signature
理解v$sql的exact_matching_signature与force_matching_signature 对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不 ...