Angular 从0到1 (一)

作者: 接灰的电子产品 | 来源:发表于2016-10-27 17:45 被阅读33489次

史上最简单Angular2教程,大叔都学会了

作者:王芃 wpcfan@gmail.com

第一节:初识Angular-CLI
第二节:登录组件的构建
第三节:建立一个待办事项应用
第四节:进化!模块化你的应用
第五节:多用户版本的待办事项应用
第六节:使用第三方样式库及模块优化用
第七节:给组件带来活力
Rx--隐藏在Angular 2.x中利剑
Redux你的Angular 2应用
第八节:查缺补漏大合集(上)
第九节:查缺补漏大合集(下)

第一节:认识Angular 2.0

前言

Angular 2 是Google推出的一个跨平台全终端的框架,和目前比较火的React和Vue.js相比,有如下优点:

  1. 由于Google的目的是推出一个完整解决方案,所以官方默认提供的类库(比如routing,http,依赖性注入(DI)等)非常完整,无需自己选择。React的一大痛点就是选择太多导致在配置寻找组件和类库的过程中消耗太多精力,当然从另一方面看这也是其优势,选择众多且自由。
  2. 官方支持TypeScript(微软出品,是JavaScript的超集,是 JavaScript 的强类型版本)作为首选编程语言,使得开发脚本语言的一些问题可以更早更方便的找到。
  3. RxJS友好使得响应式编程在Augular2中变得极为容易(Google开发的框架依赖这么多的微软的产品,可见微软的转型还是很成功的)
  4. 支持NativeScript甚至ReactNative等进行原生Android/iOS应用开发(React支持React Native)
  5. 支持服务器端渲染(React也支持)

但总体来讲,个人认为Angular2更适合从原生App开发或后端Java/.Net等转型过来开发前端的程序员,因为它的开发模型更接近于传统强类型语言的模式,加上官方内建的组件和类库比较完整,有官方中文站点,学习曲线要低一些。有过Angular 1.x 开发经验的同学要注意了,虽然只有一个版本号的差距,但2.x和1.x是完全不同的,不要奢望1.x的应用会平滑迁移到2.x。

环境配置要求

Angular2需要node.js和npm,我们下面的例子需要node.js 6.x.x和npm 3.x.x,请使用 node -vnpm -v 来检查。由于众所周知的原因,http://npmjs.org 的站点访问经常不是很顺畅,这里给出一个由淘宝团队维护的国内镜像 http://npm.taobao.org/ 。安装好node后,请打开命令行窗口( Windows 用户推荐使用 PowerShell,其它平台打开 Terminal 即可)输入npm config set registry https://registry.npm.taobao.org 。或者直接使用淘宝团队的 cnpm,使用下面的命令安装 cnpm : npm install -g cnpm --registry=https://registry.npm.taobao.org

官方快速起步文档给出的例子不同,我们下面要使用Angular团队目前正在开发中的一个工具--Angular CLI 。这是一个类似于React CLI和Ember CLI的命令行工具,用于快速构建Angular2的应用。它的优点是进一步屏蔽了很多配置的步骤、自动按官方推荐的模式进行代码组织、自动生成组件/服务等模板以及更方便的发布和测试代码。由于目前这个工具已经release了,安装时请使用 npm install -g @angular/cli 命令。这个安装过程有些长,请务必等待命令行提示符重新出现。安装好之后,我们就可以使用一个叫做 ng 的命令了,这个命令是我们后面经常要打交道的:包括创建新工程,启动工程,编译等。

IDE的选择也比较多,免费的Visual Studio CodeAtom,收费的有WebStorm。我们这里推荐采用 Visual Studio Code,可以到 https://code.visualstudio.com/ 下载 Windows/Linux/MacOS 版本。

安装完以上这些工具,开发环境就部署好了,下面我们将开始Angular2的探险之旅。

第一个小应用 Hello Angular

那么现在开启一个terminal(命令行窗口),键入 ng new hello-angular --skip-install , 然后进入 hello-angular 目录执行 cnpm install。由于很多童鞋遇到安装问题,推荐在新建 project 时忽略安装 ( 加 --skip-install 参数),然后用 cnpm 执行依赖安装。

c1_s1_ng_new_hello-angular.png-51.7kBc1_s1_ng_new_hello-angular.png-51.7kB 如上图所示,这个命令为我们新建了一个名为“hello-angular”的工程,进入该工程目录,键入 code . 可以打开IDE看到如下目录
c1_s1_vscode_project_struct.png-300.1kBc1_s1_vscode_project_struct.png-300.1kB

|-- .editorconfig //通用的编辑器配置文件,以后换IDE时可以保持一些设置的平滑迁移
|-- .gitignore //需要Git忽略的文件列表
|-- angular-cli.json //Angular-CLI配置文件
|-- karma.conf.js //Karma单元测试配置文件
|-- package.json //node打包文件
|-- protractor.conf.js //端到端测试配置文件(集成测试)
|-- README.md
|-- tslint.json //代码Lint静态检查的配置
|-- e2e //端到端测试代码目录
| |-- app.e2e-spec.ts
| |-- app.po.ts
| |-- tsconfig.json
|-- src //源码
|-- favicon.ico //站点收藏图标
|-- index.html //入口页面
|-- main.ts //入口ts文件
|-- polyfills.ts //针对浏览器能力增强的polyfills引用文件
|-- styles.css //全局样式文件
|-- test.ts //测试入口文件
|-- tsconfig.json //TypeScript配置文件
|-- typings.d.ts //项目中使用的TypeScript类型定义引用文件
|-- app //应用目录
| |-- app.component.css //引导性组件的样式文件
| |-- app.component.html //引导性组件的HTML模板
| |-- app.component.spec.ts //引导性组件测试文件
| |-- app.component.ts //系统引导性组件
| |-- app.module.ts //应用根模块
| |-- index.ts //应用入口
|-- assets //站点资源文件夹
| |-- .gitkeep
|-- environments
|-- environment.prod.ts //生产环境配置文件
|-- environment.ts //环境配置
大概了解了文件目录结构后,我们重新回到命令行,在应用根目录键入 ng serve 可以看到应用编译打包后server运行在4200端口。

c1_s1_ng_serve.png-42.5kBc1_s1_ng_serve.png-42.5kB
打开浏览器输入 http://localhost:4200 即可看到程序运行成功啦!
c1_s1_project_1st_browser.png-135.7kBc1_s1_project_1st_browser.png-135.7kB
自动生成的太没有成就感了是不是,那么我们动手改一下吧。保持运行服务的命令窗口,然后进入VSCode,打开 src/app/app.component.ts 修改title,比如: title = 'This is a hello-angular app';,保存后返回浏览器看一下吧,结果已经更新了,这种热装载的特性使得开发变得很方便。
c1_s1_project_1st_browser_update.png-146.5kBc1_s1_project_1st_browser_update.png-146.5kB

第一个组件

那么我们来为我们的app增加一个Component吧,在命令行窗口输入 ng generate component login --inline-template --inline-style 。 顾名思义,参数generate是用来生成文件的,参数component是说明我们要生成一个组件,login呢是我们的组件名称,你可以自己想个其他有意思的名字。后面的两个参数是告诉angular-cli:生成组件时,请把组件的HTML模板和CSS样式和组件放在同一个文件中(其实分开文件更清晰,但第一个例子我们还是采用inline方式了)。是不是感觉这个命令行太长了?幸运的是Angular团队也这么想,所以你可以把上面的命令改写成 ng g c login -it -is ,也就是说可以用generate的首字母g来代替generate,用component的首字母c来代替component,类似的--inline-template的两个词分别取首字母变成-it

image_1b27r02qlo6f11f19qg1q9k1fclm.png-30.3kBimage_1b27r02qlo6f11f19qg1q9k1fclm.png-30.3kB
angular-cli为我们在\src\app目录下生成了一个新文件夹login,在login目录下生成了2个文件,其中 login.component.spec.ts 是测试文件,我们这里暂时不提。另一个是 login.component.ts 这个就是我们新建的Component了。Angular提倡的文件命名方式是这样的:组件名称.component.ts ,组件的HTML模板命名为: 组件名称.component.html,组件的样式文件命名为: 组件名称.component.css,大家在编码中尽量遵循Google的官方建议。

我们新生成的Login组件源码如下

import { Component, OnInit } from '@angular/core';

//@Component是Angular提供的装饰器函数,用来描述Compoent的元数据
//其中selector是指这个组件的在HTML模板中的标签是什么
//template是嵌入(inline)的HTML模板,如果使用单独文件可用templateUrl
//styles是嵌入(inline)的CSS样式,如果使用单独文件可用styleUrls
@Component({
  selector: 'app-login',
  template: `
    <p>
      login Works!
    </p>
  `,
  styles: []
})
export class LoginComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

那么这个组件建成后,我们怎么使用呢?注意上面的代码中@Component修饰配置中的 selector: 'app-login',这意味着我们可以在其他组件的template中使用 <app-login></app-login> 来引用我们的这个组件。

现在我们打开 hello-angular\src\app\app.component.html 加入我们的组件引用

<h1>
  {{title}}
</h1>
<app-login></app-login>

保存后返回浏览器,可以看到我们的第一个组件也显示出来了。


image_1b27qsmhp1nlrb8g1uh6cp71qcj9.png-19kBimage_1b27qsmhp1nlrb8g1uh6cp71qcj9.png-19kB

一些基础概念

这里我们粗略介绍一些Angular的基础概念,这些基础概念在后面的章节中会更详细的讲解。

什么是模块?

简单来说模块就是提供相对独立功能的功能块,每块聚焦于一个特定业务领域。Angular内建的很多库是以模块形式提供的,比如FormsModule封装了表单处理,HttpModule封装了Http的处理等等。每个Angular应用至少有一个模块类 —— 根模块,我们将通过引导根模块来启动应用。按照约定,根模块的类名叫做AppModule,被放在 app.module.ts 文件中。我们这个例子中的根模块位于 hello-angular\src\app\app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

@NgModule装饰器用来为模块定义元数据。declarations列出了应用中的顶层组件,包括引导性组件AppComponent和我们刚刚创建的LoginComponent。在module里面声明的组件在module范围内都可以直接使用,也就是说在同一module里面的任何Component都可以在其模板文件中直接使用声明的组件,就想我们在AppComponent的模板末尾加上 <app-login></app-login> 一样。

imports引入了3个辅助模块:

  • BrowserModule提供了运行在浏览器中的应用所需要的关键服务(Service)和指令(Directive),这个模块所有需要在浏览器中跑的应用都必须引用;
  • FormsModule提供了表单处理和双向绑定等服务和指令
  • HttpModule提供Http请求和响应的服务

providers列出会在此模块中“注入”的服务(Service),关于依赖性注入会在后面章节中详细解释。
bootstrap指明哪个组件为引导性组件(本案例中的AppComponent)。当Angular引导应用时,它会在DOM中渲染这个引导性组件,并把结果放进index.html的该组件的元素标签中(本案例中的app-root)。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>HelloAngular</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root>Loading...</app-root>
</body>
</html>

引导过程

Angular2通过在main.ts中引导AppModule来启动应用。针对不同的平台,Angular提供了很多引导选项。下面的代码是通过即时(JiT)编译器动态引导,一般在进行开发调试时,默认采用这种方式。

//main.ts
import './polyfills.ts';

// 连同Angular编译器一起发布到浏览器
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { environment } from './environments/environment';
import { AppModule } from './app/';

if (environment.production) {
  enableProdMode();
}
//Angular编译器在浏览器中编译并引导该应用
platformBrowserDynamic().bootstrapModule(AppModule);

另一种方式是使用预编译器(AoT - Ahead-Of-Time)进行静态引导,静态方案可以生成更小、启动更快的应用,建议优先使用它,特别是在移动设备或高延迟网络下。使用static选项,Angular编译器作为构建流程的一部分提前运行,生成一组类工厂。它们的核心就是AppModuleNgFactory。引导预编译的AppModuleNgFactory的语法和动态引导AppModule类的方式很相似。

// 不把编译器发布到浏览器
import { platformBrowser } from '@angular/platform-browser';

// 静态编译器会生成一个AppModule的工厂AppModuleNgFactory
import { AppModuleNgFactory } from './app.module.ngfactory';

// 引导AppModuleNgFactory
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);

本节代码:https://github.com/wpcfan/awesome-tutorials/tree/chap01/angular2/ng2-tut

下一节我们再继续,记住大叔能学会的你也能。

慕课网 Angular 视频课上线: http://coding.imooc.com/class/123.html?mc_marking=1fdb7649e8a8143e8b81e221f9621c4a&mc_channel=banner

有问题的童鞋可以加入我的小密圈讨论: http://t.xiaomiquan.com/jayRnaQ (该链接7天内(5月14日前)有效)

纸书出版了,比网上内容丰富充实了,欢迎大家订购!
京东链接:https://item.m.jd.com/product/12059091.html?from=singlemessage&isappinstalled=0

Angular从零到一Angular从零到一

第一节:初识Angular-CLI
第二节:登录组件的构建
第三节:建立一个待办事项应用
第四节:进化!模块化你的应用
第五节:多用户版本的待办事项应用
第六节:使用第三方样式库及模块优化用
第七节:给组件带来活力
Rx--隐藏在Angular 2.x中利剑
Redux你的Angular 2应用
第八节:查缺补漏大合集(上)
第九节:查缺补漏大合集(下)

相关文章

  • Angular 从0到1 (一)

    史上最简单Angular2教程,大叔都学会了 作者:王芃 wpcfan@gmail.com 第一节:初识Angul...

  • Redux你的Angular 2应用--ngRx使用体验 | 掘

    Angular2和Rx的相关知识可以看我的Angular 2.0 从0到1系列第一节:Angular 2.0 从0...

  • Angular 2+ 的组件生命周期

    参考资料: angular 2.0 从0到1 -> #Angular 2的组件生命周期

  • Angular 从0到1 (六)

    第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第...

  • Angular 从0到1 (七)

    第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第...

  • Angular 从0到1 (五)

    第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第...

  • Angular 从0到1 (二)

    第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第...

  • Angular 从0到1 (四)

    第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第...

  • Angular 从0到1 (三)

    作者:王芃 wpcfan@gmail.com 第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立...

  • Redux你的Angular应用

    Angular2和Rx的相关知识可以看我的Angular 2.0 从0到1系列 第一节:初识Angular-CLI...

网友评论

  • lliyuu520:吃我一记洛阳铲,感谢楼主,从知乎过来的
  • 叫我三米大人:您好,我想请问一下超大型的sass平台web应用能否选用angular,应该怎样部署
  • 叫我三米大人:您好,想请问下对于超大型的sass平台web应用,可以选用angular吗?应该怎么部署
  • 42a945692e8e:因为要学习angular2,在网上找了好多入门教程,一开始都看的云里雾里。您讲的非常清晰,还有一些能上手的小例子,想问下实体书的内容比网上的教程更加丰富么?非常感谢无私的分享,
    42a945692e8e:@接灰的电子产品 买一本!
    接灰的电子产品:@EvanZhang132 比网上内容多一些,但主体部分差不多,有些部分纸书说的详细些,例子和实践总多一些
  • Lattice立叔:你好,VSC可以推荐下Angular4的插件吗,哈哈:wink:
  • 辉_1592:楼主请教一下,用aot的那个main.ts里报错:
    message: 'Cannot find module './app.module.ngfactory'.'
    这个是什么原因呢?
  • 追逐cc:现在外面好多公司都要求会angular。最近一直在纠结到底是先学习ng1还是ng2,我了解过1
  • leikeren:进入 ng serve 后 如何退出服务呢?
    接灰的电子产品:@leikeren ctrl-c
  • ba9d991d3a8d:感谢作者君的教程
    请问适用于 angular2 的 UI 库哪个比较好 组件足够多、功能最复杂成熟的
    我知道的几个有
    1. ng2-bootstrap
    2. PrimeNG
    3. Angular-Material2
    4. KendoUI
    5. Ionic (移动端)
    ba9d991d3a8d:@接灰的电子产品 ionic2 跟 ionic一样都是针对 mobile 的吧 我需要针对桌面的
    ba9d991d3a8d:@接灰的电子产品 inoic2 ? ionic2?
    接灰的电子产品:最稳定的是官方的,功能最全的是inoic2和primeng,最灵活方式是用css库自己写控件
  • 揚灵:关注下ng2,虽然现在已经研究react等了,但以前ng1也是用过许久的
    withzhang: @揚灵 今天我也遇到了这类问题,清理了浏览器缓存就好了
    接灰的电子产品:嗯嗯,其实ng2很爽的,看看吧
  • 接灰的电子产品:快要出纸书了:smile:
    接灰的电子产品:@接灰的电子产品 纸书出版了
  • 215f624f1b60:我照文章的步骤,在两台win7的电脑上安装好了angular-cli(实际是安装了新的@angular/cli),在一台电脑上访问http://localhost:4200一切正常,代码已经敲了几章了,非常感谢!但在另一台电脑上却只显示loading....,刚new的项目就只显示loading...把正常的那台电脑的项目文件拷过另一台电脑ng serve再访问也是一样,出错信息是:Uncaught TypeError: Cannot call method 'apply' of undefined vendor.bundle.js:48790,几次重装node和@angular/cli都一样未解决,一直找不到是什么原因。
    接灰的电子产品:是否确认angular/cli安装完成,那个过程有时非常长,第二是否重装cli之前是否删除了cli,并且清除了npm cache
  • 58ffe95339d5:win10安装angular报错。node是v6.2.8,npm是3.5.8。都按你的步骤走了,不知道哪里出问题了。:sob:
    接灰的电子产品:@shanaFang 一般是网络原因,用cnpm或者使用vpn科学上网
    接灰的电子产品:@shanaFang 出错信息是什么
    接灰的电子产品:@shanaFang 翻墙
  • 清华同方:很好啊
    接灰的电子产品:你要在工程目录运行ng serve啊,比如你ng new hello,就要到hello目录下运行ng serve啊
    易冷zzz:你好 我在运行ng serve的时候报错 you have to inside an angular-cli project in order to user serve command。但是我已经安装angular-cli,运行ng -v显示angular-cli1.0.0-beta.28.3 ,请问是哪里出了问题?还有创建完项目为什么要键入code.?对了,我安装完node.js 安装cnpm也会报错,新人求解
    接灰的电子产品:@清华同方 谢谢支持
  • 呼呼X南风:您好,我在学习angular2的过程中遇到一个问题,请教一下,希望您解答一下。
    菜单导航数据结构怎么写呢?
    下面是我自己写的,在运行的时候报错。
    export class menu {
    //
    id:number;
    // 名称
    name:string;
    description:string;
    // icon
    menuIcon?:string;
    routeUrl?:string;
    // submenu
    subMenus?:menu[];
    // active
    active?:boolean;


    constructor(id:number, name:string, description:string, menuIcon:string, routeUrl:string) {
    this.id = id;
    this.name = name;
    this.description = description;
    this.menuIcon = menuIcon;
    this.routeUrl = routeUrl;
    }

    setMenus(menus:menu[]) {

    this.subMenus = menus;
    }
    }
    接灰的电子产品:@薛彦军 报错信息是什么?constructor没啥意义啊,对于领域对象来说
  • Dnge:写得很不错。。。辛苦了!!
    接灰的电子产品:谢谢支持,一起学习
  • c7f01d442def:第三篇 todo.component.html中 li 标签的 [class.completed]="todo.completed"谁能解释一下吗?谢谢
  • c7f01d442def: @接灰的电子产品 你知道,浏览器报Unhandled Promise rejection:auth is not an object.什么原因呀!我敲完第三节
    接灰的电子产品:@_云端 检查一下是否都声明了类型
    c7f01d442def:功能正常,但是就是报错
  • c7f01d442def:我用ng 命令创建angular工程会一直卡在installing packages for tooling via npm. 创建不了
    接灰的电子产品:@_云端 这个不是angular的问题,到了npm install那步其实就是npm安装你的依赖包,那步过不去很可能是你的网络环境或者npm站点响应慢。如果没有报错建议多等一会
    c7f01d442def: @接灰的电子产品设置了,依旧卡在那
    接灰的电子产品:@_云端 这个过程时间会比较长,你有没有按照教程把npm repository换成淘宝的啊?否则速度很慢的
  • silentmx:app.module.ngfactory里不知道怎么写
    silentmx:@接灰的电子产品 好的谢谢,秒回啊
    接灰的电子产品:不用知道,cli会帮你搞定,往后看,第6章会讲
  • wkylin:angular-cli 基于ember-cli 需要全局安装ember-cli

    npm install -g ember-cli

    接灰的电子产品:@wkylin 你什么环境啊,不可能啊,我windows和mac都是直接执行滴
    wkylin:@接灰的电子产品 不安装 执行ng generate component login --inline-template --inline-style时会有提示,并且执行不了,需要安装
    接灰的电子产品:@wkylin 亲,不需要滴
  • 97c8870576cc:非常宝贵的经验,正好自己也在用ws做angularCLI的学习项目,有了作者的这些细节解释感觉学习很快。
    强烈推荐
  • 409eeb240be5:讲得不错
    接灰的电子产品:@Aoqidx 谢谢支持
  • 圣杰:VsCode 的Debuger For Chrome 插件 无法调试 angular-cli生成的angular 2项目?

    接灰的电子产品:@阿甘呀 哈哈,喜欢就好
    阿甘呀:“大叔(神)”真的讲的很棒棒啊,最近正在学习,您可真是把我是领入门了,学习到了很不错的东西,会一直跟下去,期待您更多的优秀作品:yum:
    接灰的电子产品:@圣杰 可以调试,下一章节我写一下吧
  • Gooiem::relaxed: 请教文中增加一个Component 的命令后面的 -it -is 是什么意思?不用这两个参数反而能自动生成*.component.css文件和*.component.html,用了就只能生成*.component.ts文件和*.component.spec.ts
    接灰的电子产品:@Gooiem 是的
    Gooiem:是不是把html和css文件都放到*.component.ts文件里了啊
    接灰的电子产品:it就是inline template的缩写,即不为组件创建单独的模版文件is就是inline style的缩写,即不为组件创建单独的样式文件
  • c309e61aeec7:很不错
    接灰的电子产品:@Michael001 多提宝贵意见

本文标题:Angular 从0到1 (一)

本文链接:https://www.haomeiwen.com/subject/idlsuttx.html