angular入门
<div><h1>一、Angular 介绍</h1>
<blockquote>
<p><code>Angualr</code> 是一款来自谷歌的开源的 <code>web</code> 前端框架,诞生于 <code>2009</code> 年,由 <code>Misko Hevery</code> 等 人创建,后为 <code>Google</code> 所收购。是一款优秀的前端 <code>JS</code> 框架,已经被用于 <code>Google</code> 的多款产品当中。</p>
</blockquote>
<ul>
<li>根据项目数统计 <code>angular(1.x 、2.x 、4.x、5.x、6.x、7.x)</code>是现在网上使用量最大的框架</li>
<li><code>Angualr</code> 基于 <code>TypeScript</code> 和 <code>react</code>、<code>vue</code> 相比, <code>Angular</code> 更适合中大型企业级项目。</li>
</ul>
<blockquote>
<p>目前 2018 年 11 月 25 日 <code>angular</code> 最新版本 <code>angular7.x</code>。根据官方介绍,<code>Angular</code> 每过几个月 就会更新一个版本。此教程同样适用于后期更新的 <code>Angular8.x</code>、<code>Angular9.x</code></p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1288" data-height="598"><img src="//upload-images.jianshu.io/upload_images/1480597-981a84fee307935b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>学习 Angular 必备基础</strong></p>
<blockquote>
<p>必备基础:<code>html</code> 、<code>css</code> 、<code>js</code>、<code>es6</code>、<code>Typescript</code></p>
</blockquote>
<h1>二、Angular 环境搭建及创建项目</h1>
<h2>2.1 环境搭建</h2>
<p><strong>1. 安装 nodejs</strong></p>
<blockquote>
<p>安装 <code>angular</code> 的计算机上面必须安装最新的 <code>nodejs</code>--注意安装 <code>nodejs</code> 稳定版本</p>
</blockquote>
<p><strong>2. 安装 cnpm</strong></p>
<blockquote>
<p>npm 可能安装失败建议先用 <code>npm</code> 安装一下 <code>cnpm</code> 用淘宝镜像安装<code>https://npm.taobao.org</code></p>
</blockquote>
<pre class="hljs bash"><code class="bash">npm install -g cnpm --registry=https://registry.npm.taobao.org
</code></pre>
<p><strong>3. 使用 npm/cnpm 命令安装 angular/cli</strong></p>
<pre class="hljs bash"><code class="bash">npm install -g @angular/cli
<span class="hljs-comment"># 或者
cnpm install -g @angular/cli
</span></code></pre>
<blockquote>
<p><code>ng v</code> 查看版本信息</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1352" data-height="1080"><img src="//upload-images.jianshu.io/upload_images/1480597-03bfdfb5fbe33072.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">angular cli</div>
</div>
<p><strong>4. 安装插件</strong></p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1322" data-height="766"><img src="//upload-images.jianshu.io/upload_images/1480597-2bdda6e300581705.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>5. 安装chrome扩展</strong></p>
<blockquote>
<p>https://augury.angular.io/</p>
</blockquote>
<blockquote>
<p>用<code>augury</code>查看<code>component</code>结构,更方便调试</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="2872" data-height="1304"><img src="//upload-images.jianshu.io/upload_images/1480597-0deeca08d9802b29.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<h2>2.2 创建项目</h2>
<pre class="hljs bash"><code class="bash"><span class="hljs-comment"># 创建项目
ng new my-app
<span class="hljs-built_in">cd my-app
<span class="hljs-comment"># 运行项目
ng serve --open
</span></span></span></code></pre>
<h2>2.3 目录结构分析</h2>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1696" data-height="1000"><img src="//upload-images.jianshu.io/upload_images/1480597-2cb7c7aa06aa3e2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<blockquote>
<p>详情参考 https://www.angular.cn/guide/file-structure</p>
</blockquote>
<p><strong>app目录(重点)</strong></p>
<blockquote>
<p><code>app</code>目录是我们要编写的代码目录。我们写的代码都是放在这个目录。<br>
一个<code>Angular</code>程序至少需要一个模块和一个组件。在我们新建项目的时候命令行已经默认生成出来了</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="301" data-height="151"><img src="//upload-images.jianshu.io/upload_images/1480597-7a8a287d49ec4026.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/301/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<ul>
<li>
<code>app.component.ts</code>:这个文件表示组件,</li>
<li>组件是<code>Angular</code>应用的基本构建模块,可以理解为一段带有业务逻辑和数据的<code>Html</code><br>
我们来看看<code>app.component.ts</code>中的代码,并解释下代码的意义</li>
</ul>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="2562" data-height="1154"><img src="//upload-images.jianshu.io/upload_images/1480597-222e69dfde39a005.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">app.component.ts</div>
</div>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">/*这里是从Angular核心模块里面引入了component装饰器*/
<span class="hljs-keyword">import {Component} <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-comment">/*用装饰器定义了一个组件以及组件的元数据所有的组件都必须使用这个装饰器来注解*/
@Component({
<span class="hljs-comment">/*组件元数据Angular会通过这里面的属性来渲染组件并执行逻辑
* selector就是css选择器,表示这个组件可以通过app-root来调用,index.html中有个<app-root>Loading...</app-root>标签,这个标签用来展示该组件的内容
*templateUrl组件的模板,定义了组件的布局和内容
*styleUrls 该模板引用那个css样式
* */
selector: <span class="hljs-string">'app-root',
<span class="hljs-attr">templateUrl: <span class="hljs-string">'./app.component.html',
<span class="hljs-attr">styleUrls: [<span class="hljs-string">'./app.component.css']
})
<span class="hljs-comment">/*AppComponent本来就是一个普通的typescript类,但是上面的组件元数据装饰器告诉Angular,AppComponent是一个组件,需要把一些元数据附加到这个类上,Angular就会把AppComponent当组件来处理*/
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppComponent {
<span class="hljs-comment">/*这个类实际上就是该组件的控制器,我们的业务逻辑就是在这个类中编写*/
title = <span class="hljs-string">'学习Angular';
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>组件相关的概念</strong></p>
<ol>
<li>组件元数据装饰器(<code>@Component</code>)<br>
简称组件装饰器,用来告知<code>Angular</code>框架如何处理一个<code>TypeScript</code>类.<br>
<code>Component</code>装饰器包含多个属性,这些属性的值叫做元数据,<code>Angular</code>会根据这些元数据的值来渲染组件并执行组件的逻辑</li>
<li>模板(<code>Template</code>)<br>
我们可以通过组件自带的模板来定义组件的外观,模板以<code>html</code>的形式存在,告诉<code>Angular</code>如何来渲染组件,一般来说,模板看起来很像<code>html</code>,但是我们可以在模板中使用<code>Angular</code>的数据绑定语法,来呈现控制器中的数据。</li>
<li>控制器(<code>controller</code>)<br>
控制器就是一个普通的<code>typescript</code>类,他会被<code>@Component</code>来装饰,控制器会包含组件所有的属性和方法,绝大多数的业务逻辑都是写在控制器里的。控制器通过数据绑定与模板来通讯,模板展现控制器的数据,控制器处理模板上发生的事件。</li>
</ol>
<p><strong>装饰器</strong>,模板和控制器是组件的必备要素。还有一些可选的元素,比如:</p>
<ul>
<li>输入属性(<code>@inputs</code>):是用来接收外部传入的数据的,<code>Angular</code>的程序结构就是一个组件树,输入属性允许在组件树种传递数据<br>
提供器(<code>providers</code>):这个是用来做依赖注入的</li>
<li>生命周期钩子(<code>LifeCycle Hooks</code>):一个组件从创建到销毁的过程中会有多个钩子会被触发,类似于Android中的<code>Activity</code>的生命周期</li>
<li>样式表:组件可以关联一些样式表</li>
<li>动画(<code>Animations</code>): <code>Angular</code>提供了一个动画包来帮助我们方便的创建一些跟组件相关的动画效果,比如淡入淡出等</li>
<li>输出属性(<code>@Outputs</code>):用来定义一些其他组件可能需要的事件或者用来在组件之间共享数据</li>
</ul>
<blockquote>
<p>组件的中关系就如下图所示</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1200" data-height="496"><img src="//upload-images.jianshu.io/upload_images/1480597-7223faf5cf1f3922.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p>下面我们来看看模块文件</p>
<ul>
<li>
<code>app.module.ts</code>:这个文件表示模块</li>
<li>与<code>AppComponent</code>类似,模块也需要装饰器来装饰</li>
</ul>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { BrowserModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/platform-browser';
<span class="hljs-keyword">import { NgModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-keyword">import { AppRoutingModule } <span class="hljs-keyword">from <span class="hljs-string">'./app-routing.module';
<span class="hljs-keyword">import { AppComponent } <span class="hljs-keyword">from <span class="hljs-string">'./app.component';
<span class="hljs-keyword">import { HeroesComponent } <span class="hljs-keyword">from <span class="hljs-string">'./heroes/heroes.component';
@NgModule({
<span class="hljs-attr">declarations: [
<span class="hljs-comment">// 声明模块里有什么东西 只能声明:组件/指令/管道
AppComponent,
HeroesComponent
],
<span class="hljs-comment">// 声明该模块所依赖的模块
imports: [
BrowserModule,
AppRoutingModule
],
<span class="hljs-comment">// 默认情况下是空的
providers: [],
<span class="hljs-comment">// 声明模块的主组件是什么
bootstrap:
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppModule { }
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>2.4 Angular cli</h2>
<blockquote>
<p>https://cli.angular.io</p>
</blockquote>
<blockquote>
<p>通过<code>ng g</code>列出当前命令</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1428" data-height="1550"><img src="//upload-images.jianshu.io/upload_images/1480597-77b3c17abd045ecd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">ng g</div>
</div>
<p><strong>1. 创建新组件 <code>ng generate component component-name</code></strong></p>
<blockquote>
<p><code>ng g component components/header</code> 指定生成到哪个目录</p>
</blockquote>
<p>该命令会把生成的组件,添加到 <code>src/app/app.module.ts</code> 文件中 <code>@NgModule</code> 的 <code>declarations</code> 列表中声明</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1904" data-height="1124"><img src="//upload-images.jianshu.io/upload_images/1480597-5b49e4ebc275a90e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>2. 使用 Angular CLI 创建一个名叫 hero 的服务</strong></p>
<pre class="hljs undefined"><code>ng generate service hero
</code></pre>
<blockquote>
<p>该命令会在 <code>src/app/hero.service.ts</code> 中生成 <code>HeroService</code> 类的骨架。 <code>HeroService</code> 类的代码如下:</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Injectable } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
@Injectable({
<span class="hljs-attr">providedIn: <span class="hljs-string">'root',
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">HeroService {
<span class="hljs-keyword">constructor() { }
}
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>3. 添加 AppRoutingModule</strong></p>
<pre class="hljs cpp"><code class="cpp">ng generate <span class="hljs-keyword">module app-routing --flat --<span class="hljs-keyword">module=app
</span></span></code></pre>
<ul>
<li><code>--flat</code> 把这个文件放进了 <code>src/app</code> 中,而不是单独的目录中。</li>
<li><code>--module=app</code> 告诉 <code>CLI</code> 把它注册到 <code>AppModule</code>的 <code>imports</code> 数组中。</li>
</ul>
<p>生成的文件是这样的:</p>
<pre class="hljs javascript"><code class="javascript">src/app/app-routing.module.ts (generated)
content_copy
<span class="hljs-keyword">import { NgModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-keyword">import { CommonModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/common';
@NgModule({
<span class="hljs-attr">imports: [
CommonModule
],
<span class="hljs-attr">declarations: []
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppRoutingModule { }
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>修改后</p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { NgModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-keyword">import { Routes, RouterModule } <span class="hljs-keyword">from <span class="hljs-string">'@angular/router';
<span class="hljs-keyword">const routes: Routes = [];
@NgModule({
<span class="hljs-attr">imports: ,
<span class="hljs-attr">exports:
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppRoutingModule { }
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>三、angular组件及组件里的模板</h1>
<h2>3.1 创建angualr组件</h2>
<p><strong>1. 创建组件</strong></p>
<pre class="hljs bash"><code class="bash">ng g component components/header
</code></pre>
<p><strong>2. 使用组件</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">app-header><span class="hljs-tag"></<span class="hljs-name">app-header>
</span></span></span></span></code></pre>
<h2>3.2 Angular 绑定数据</h2>
<p><strong>1. 数据文本绑定</strong></p>
<blockquote>
<p>定义数据几种方式</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="810" data-height="920"><img src="//upload-images.jianshu.io/upload_images/1480597-78d5b2e181f0c2ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/810/format/webp"></div>
</div>
<div class="image-caption">定义数据几种方式</div>
</div>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h1>{{title}}<span class="hljs-tag"></<span class="hljs-name">h1>
</span></span></span></span></code></pre>
<p><strong>2. 绑定<code>HTML</code></strong></p>
<pre class="hljs cpp"><code class="cpp"> <span class="hljs-keyword">this.h=<span class="hljs-string">"<h2>这是一个 h2 用来解析</h2>"
</span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"> <div =<span class="hljs-string">"h"><span class="xml"><span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></code></pre>
<h2>3.3 声明属性的几种方式</h2>
<ul>
<li><code>public</code> 共有(默认) 可以在类里外使用</li>
<li><code>protected</code> 保护类型 只能在当前类和子类中使用</li>
<li><code>private</code> 私有类型 只能在当期类使用</li>
</ul>
<h2>3.4 绑定属性</h2>
<blockquote>
<p>用<code>[]</code>包裹</p>
</blockquote>
<pre class="hljs xml"><code class="xml"> <span class="hljs-tag"><<span class="hljs-name">div [<span class="hljs-attr">id]=<span class="hljs-string">"id" [<span class="hljs-attr">title]=<span class="hljs-string">"msg">调试工具看看我的属性<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1488" data-height="194"><img src="//upload-images.jianshu.io/upload_images/1480597-305cca1bb2c88059.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<h2>3.5 数据循环 *ngFor</h2>
<p>*<em>1. <em>ngFor 普通循环</em></em></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">HomeComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
arr = [{ <span class="hljs-attr">name: <span class="hljs-string">'poetries', <span class="hljs-attr">age: <span class="hljs-number">22 }, { <span class="hljs-attr">name: <span class="hljs-string">'jing' , <span class="hljs-attr">age: <span class="hljs-number">31}];
<span class="hljs-keyword">constructor() { }
ngOnInit() {
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">ul *<span class="hljs-attr">ngIf=<span class="hljs-string">"arr.length>0">
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of arr">{{item.name}}- {{item.age}}<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>2. 循环的时候设置 key</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of list;let i = index;"> <span class="hljs-comment"><!-- 把索引index赋给i -->
{{item}} --{{i}}
<span class="hljs-tag"></<span class="hljs-name">li> <span class="hljs-tag"></<span class="hljs-name">ul>
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>3. template 循环数据</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li <span class="hljs-attr">template=<span class="hljs-string">"ngFor let item of list">
{{item}}
<span class="hljs-tag"></<span class="hljs-name">li> <span class="hljs-tag"></<span class="hljs-name">ul>
</span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.6 条件判断 *ngIf</h2>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p *<span class="hljs-attr">ngIf=<span class="hljs-string">"list.length > 3">这是 ngIF 判断是否显示<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-tag"><<span class="hljs-name">p <span class="hljs-attr">template=<span class="hljs-string">"ngIf list.length > 3">这是 ngIF 判断是否显示<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.7 *ngSwitch</h2>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">ul [<span class="hljs-attr">ngSwitch]=<span class="hljs-string">"score">
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngSwitchCase=<span class="hljs-string">"1">已支付<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngSwitchCase=<span class="hljs-string">"2">订单已经确认<span class="hljs-tag"></<span class="hljs-name">li> <span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngSwitchCase=<span class="hljs-string">"3">已发货<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngSwitchDefault>无效<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.8 执行事件 (click)=”getData()”</h2>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">button <span class="hljs-attr">class=<span class="hljs-string">"button" (<span class="hljs-attr">click)=<span class="hljs-string">"getData()"> 点击按钮触发事件
<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"><<span class="hljs-name">button <span class="hljs-attr">class=<span class="hljs-string">"button" (<span class="hljs-attr">click)=<span class="hljs-string">"setData()"> 点击按钮设置数据
<span class="hljs-tag"></<span class="hljs-name">button>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java">getData(){ <span class="hljs-comment">/*自定义方法获取数据*/ <span class="hljs-comment">//获取
alert(<span class="hljs-keyword">this.msg);
}
setData(){
<span class="hljs-comment">//设置值
<span class="hljs-keyword">this.msg=<span class="hljs-string">'这是设置的值';
}
</span></span></span></span></span></span></code></pre>
<h2>3.9 表单事件</h2>
<pre class="hljs bash"><code class="bash"><input
<span class="hljs-built_in">type=<span class="hljs-string">"text"
(keyup)=<span class="hljs-string">"keyUpFn(<span class="hljs-variable">$event)"/>
<input <span class="hljs-built_in">type=<span class="hljs-string">"text" (keyup)=<span class="hljs-string">"keyUpFn(<span class="hljs-variable">$event)"/>
</span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs cpp"><code class="cpp">keyUpFn(e){
console.<span class="hljs-built_in">log(e)
}
</span></code></pre>
<h2>3.10 双向数据绑定</h2>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">input [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"inputVal">
</span></span></span></span></code></pre>
<blockquote>
<p>注意引入:<code>FormsModule</code></p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {FormsModule} <span class="hljs-keyword">from <span class="hljs-string">'@angular/forms'
NgModule({
<span class="hljs-attr">declarations: [
AppComponent,
HeaderComponent,
FooterComponent,
NewsComponent
],
<span class="hljs-attr">imports: [
BrowserModule,
FormsModule
],
<span class="hljs-attr">providers: [],
<span class="hljs-attr">bootstrap:
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppModule { }
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-comment"><!--使用-->
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"text" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"inputValue"/> {{inputValue}}
</span></span></span></span></span></span></span></code></pre>
<h2>3. 11 、</h2>
<p><strong>1. :</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div [<span class="hljs-attr">ngClass]=<span class="hljs-string">"{'red': true, 'blue': false}">
这是一个 div
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></code></pre>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-keyword">public flag=<span class="hljs-literal">false;
</span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div [<span class="hljs-attr">ngClass]=<span class="hljs-string">"{'red': flag, 'blue': !flag}">
这是一个 div <span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></code></pre>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-keyword">public arr = [<span class="hljs-number">1, <span class="hljs-number">3, <span class="hljs-number">4, <span class="hljs-number">5, <span class="hljs-number">6];
</span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of arr, let i = index"> <span class="hljs-tag"><<span class="hljs-name">span [<span class="hljs-attr">ngClass]=<span class="hljs-string">"{'red': i==0}">{{item}}<span class="hljs-tag"></<span class="hljs-name">span>
<span class="hljs-tag"></<span class="hljs-name">li> <span class="hljs-tag"></<span class="hljs-name">ul>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>2. :</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div [<span class="hljs-attr">ngStyle]=<span class="hljs-string">"{'background-color':'green'}">你好 ngStyle<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">public attr=<span class="hljs-string">'red';
</span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div [<span class="hljs-attr">ngStyle]=<span class="hljs-string">"{'background-color':attr}">你好 ngStyle<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></code></pre>
<h2>3.12 管道</h2>
<pre class="hljs cpp"><code class="cpp"> <span class="hljs-keyword">public today=<span class="hljs-keyword">new Date();
</span></span></code></pre>
<pre class="hljs xml"><code class="xml"> <span class="hljs-tag"><<span class="hljs-name">p>{{today | date:'yyyy-MM-dd HH:mm:ss' }}<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></code></pre>
<p><strong>其他管道</strong></p>
<blockquote>
<p><code>angular</code>中的管道(<code>pipe</code>)是用来对输入的数据进行处理,如大小写转换、数值和日期格式化等</p>
</blockquote>
<blockquote>
<p><code>angular</code>中的管道(<code>pipe</code>) 以及自定义管道适用于<code>angular4 angualr5 angualr6 angular7</code></p>
</blockquote>
<p>常用的管道(<code>pipe</code>)有</p>
<p><strong>1. 大小写转换</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-comment"><!--转换成大写-->
<span class="hljs-tag"><<span class="hljs-name">p>{{str | uppercase}}<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-comment"><!--转换成小写-->
<span class="hljs-tag"><<span class="hljs-name">p>{{str | lowercase}}<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>2. 日期格式转换</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p>
{{today | date:'yyyy-MM-dd HH:mm:ss' }}
<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></code></pre>
<p><strong>3. 小数位数</strong></p>
<blockquote>
<p>接收的参数格式为<code>{最少整数位数}.{最少小数位数}-{最多小数位数}</code></p>
</blockquote>
<pre class="hljs xml"><code class="xml"><span class="hljs-comment"><!--保留2~4位小数-->
<span class="hljs-tag"><<span class="hljs-name">p>{{p | number:'1.2-4'}}<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></span></code></pre>
<p><strong>4. JavaScript 对象序列化</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p>
{{ { name: 'semlinker' } | json }}
<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-comment"><!-- Output: { "name": "semlinker" } -->
</span></span></span></span></span></code></pre>
<p><strong>5. slice</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p>{{ 'semlinker' | slice:0:3 }}<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-comment"><!-- Output: sem -->
</span></span></span></span></span></code></pre>
<p><strong>6. 管道链</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p>
{{ 'semlinker' | slice:0:3 | uppercase }}
<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-comment"><!-- Output: SEM -->
</span></span></span></span></span></code></pre>
<p><strong>7. 自定义管道</strong></p>
<p>自定义管道的步骤:</p>
<ul>
<li>使用 <code>@Pipe</code> 装饰器定义 <code>Pipe</code> 的 <code>metadata</code> 信息,如 <code>Pipe</code> 的名称 - 即 <code>name</code> 属性</li>
<li>实现 <code>PipeTransform</code> 接口中定义的 <code>transform</code> 方法</li>
</ul>
<p><strong>7.1 WelcomePipe 定义</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Pipe, PipeTransform } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
[@Pipe](<span class="hljs-regexp">/user/Pipe)({ <span class="hljs-attr">name: <span class="hljs-string">'welcome' })
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">WelcomePipe <span class="hljs-title">implements <span class="hljs-title">PipeTransform {
transform(value: string): string {
<span class="hljs-keyword">if(!value) <span class="hljs-keyword">return value;
<span class="hljs-keyword">if(<span class="hljs-keyword">typeof value !== <span class="hljs-string">'string') {
<span class="hljs-keyword">throw <span class="hljs-keyword">new <span class="hljs-built_in">Error(<span class="hljs-string">'Invalid pipe argument for WelcomePipe');
}
<span class="hljs-keyword">return <span class="hljs-string">"Welcome to " + value;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>7.2 WelcomePipe 使用</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div>
<span class="hljs-tag"><<span class="hljs-name">p <span class="hljs-attr">ngNonBindable>{{ 'semlinker' | welcome }}<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-tag"><<span class="hljs-name">p>{{ 'semlinker' | welcome }}<span class="hljs-tag"></<span class="hljs-name">p> <span class="hljs-comment"><!-- Output: Welcome to semlinker -->
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>7.3 RepeatPipe 定义</strong></p>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">import {Pipe, PipeTransform} from <span class="hljs-string">'@angular/core';
[<span class="hljs-meta">@Pipe](/user/Pipe)({name: <span class="hljs-string">'repeat'})
export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">RepeatPipe <span class="hljs-keyword">implements <span class="hljs-title">PipeTransform {
transform(value: any, times: number) {
<span class="hljs-keyword">return value.repeat(times);
}
}
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>7.4 RepeatPipe 使用</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">div>
<span class="hljs-tag"><<span class="hljs-name">p <span class="hljs-attr">ngNonBindable>
{{ 'lo' | repeat:3 }}
<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-tag"><<span class="hljs-name">p>
{{ 'lo' | repeat:3 }}
<span class="hljs-tag"></<span class="hljs-name">p>
<span class="hljs-comment"><!-- Output: lololo -->
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.13 实现一个人员登记表单-案例</h2>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="860" data-height="1506"><img src="//upload-images.jianshu.io/upload_images/1480597-a90dfacfafe60f6d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/860/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<pre class="hljs bash"><code class="bash"><span class="hljs-comment"># 创建组件
ng g component components/form
</span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, OnInit } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
@Component({
<span class="hljs-attr">selector: <span class="hljs-string">'app-form',
<span class="hljs-attr">templateUrl: <span class="hljs-string">'./form.component.html',
<span class="hljs-attr">styleUrls: [<span class="hljs-string">'./form.component.scss']
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">FormComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
public peopleInfo:any = {
<span class="hljs-attr">username: <span class="hljs-string">'',
<span class="hljs-attr">sex: <span class="hljs-string">'2',
<span class="hljs-attr">cityList: [<span class="hljs-string">'北京', <span class="hljs-string">'上海', <span class="hljs-string">'深圳'],
<span class="hljs-attr">city: <span class="hljs-string">'上海',
<span class="hljs-attr">hobby:[{
<span class="hljs-attr">title: <span class="hljs-string">'吃饭',
<span class="hljs-attr">checked:<span class="hljs-literal">false
},{
<span class="hljs-attr">title:<span class="hljs-string">'睡觉',
<span class="hljs-attr">checked:<span class="hljs-literal">false
},{
<span class="hljs-attr">title:<span class="hljs-string">'敲代码',
<span class="hljs-attr">checked:<span class="hljs-literal">true
}],
<span class="hljs-attr">mark:<span class="hljs-string">''
}
<span class="hljs-keyword">constructor() { }
ngOnInit() {
}
doSubmit(){
<span class="hljs-comment">/*
jquerydom操作
<input type="text" id="username" />
let usernameDom:any=document.getElementById('username');
console.log(usernameDom.value);
*/
<span class="hljs-built_in">console.log(<span class="hljs-keyword">this.peopleInfo);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h2>人员登记系统<span class="hljs-tag"></<span class="hljs-name">h2>
<span class="hljs-tag"><<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"people_list">
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li>姓 名:<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"text" <span class="hljs-attr">id=<span class="hljs-string">"username" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"peopleInfo.username" <span class="hljs-attr">value=<span class="hljs-string">"fonm_input" /><span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li>性 别:
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"radio" <span class="hljs-attr">value=<span class="hljs-string">"1" <span class="hljs-attr">name=<span class="hljs-string">"sex" <span class="hljs-attr">id=<span class="hljs-string">"sex1" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"peopleInfo.sex"> <span class="hljs-tag"><<span class="hljs-name">label <span class="hljs-attr">for=<span class="hljs-string">"sex1">男 <span class="hljs-tag"></<span class="hljs-name">label>
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"radio" <span class="hljs-attr">value=<span class="hljs-string">"2" <span class="hljs-attr">name=<span class="hljs-string">"sex"<span class="hljs-attr">id=<span class="hljs-string">"sex2" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"peopleInfo.sex"> <span class="hljs-tag"><<span class="hljs-name">label <span class="hljs-attr">for=<span class="hljs-string">"sex2">女 <span class="hljs-tag"></<span class="hljs-name">label>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li>
城 市:
<span class="hljs-tag"><<span class="hljs-name">select <span class="hljs-attr">name=<span class="hljs-string">"city" <span class="hljs-attr">id=<span class="hljs-string">"city" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"peopleInfo.city">
<span class="hljs-tag"><<span class="hljs-name">option [<span class="hljs-attr">value]=<span class="hljs-string">"item" *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of peopleInfo.cityList">{{item}}<span class="hljs-tag"></<span class="hljs-name">option>
<span class="hljs-tag"></<span class="hljs-name">select>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li>
爱 好:
<span class="hljs-tag"><<span class="hljs-name">span *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of peopleInfo.hobby;let key=index;">
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"checkbox"[<span class="hljs-attr">id]=<span class="hljs-string">"'check'+key" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"item.checked"/> <span class="hljs-tag"><<span class="hljs-name">label [<span class="hljs-attr">for]=<span class="hljs-string">"'check'+key"> {{item.title}}<span class="hljs-tag"></<span class="hljs-name">label>
&nbsp;&nbsp;
<span class="hljs-tag"></<span class="hljs-name">span>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"><<span class="hljs-name">li>
备 注:
<span class="hljs-tag"><<span class="hljs-name">textarea <span class="hljs-attr">name=<span class="hljs-string">"mark" <span class="hljs-attr">id=<span class="hljs-string">"mark" <span class="hljs-attr">cols=<span class="hljs-string">"30" <span class="hljs-attr">rows=<span class="hljs-string">"10" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"peopleInfo.mark"><span class="hljs-tag"></<span class="hljs-name">textarea>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"doSubmit()" <span class="hljs-attr">class=<span class="hljs-string">"submit">获取表单的内容<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"><<span class="hljs-name">br>
<span class="hljs-tag"><<span class="hljs-name">br>
<span class="hljs-tag"><<span class="hljs-name">br>
<span class="hljs-tag"><<span class="hljs-name">br>
<span class="hljs-tag"><<span class="hljs-name">pre>
{{peopleInfo | json}}
<span class="hljs-tag"></<span class="hljs-name">pre>
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs scss"><code class="scss"><span class="hljs-selector-tag">h2{
<span class="hljs-attribute">text-align: center;
}
<span class="hljs-selector-class">.people_list{
<span class="hljs-attribute">width: <span class="hljs-number">400px;
<span class="hljs-attribute">margin: <span class="hljs-number">40px auto;
<span class="hljs-attribute">padding:<span class="hljs-number">20px;
<span class="hljs-attribute">border:<span class="hljs-number">1px solid <span class="hljs-number">#eee;
<span class="hljs-selector-tag">li{
<span class="hljs-attribute">height: <span class="hljs-number">50px;
<span class="hljs-attribute">line-height: <span class="hljs-number">50px;
<span class="hljs-selector-class">.fonm_input{
<span class="hljs-attribute">width: <span class="hljs-number">300px;
<span class="hljs-attribute">height: <span class="hljs-number">28px;
}
}
<span class="hljs-selector-class">.submit{
<span class="hljs-attribute">width: <span class="hljs-number">100px;
<span class="hljs-attribute">height: <span class="hljs-number">30px;
<span class="hljs-attribute">float: right;
<span class="hljs-attribute">margin-right: <span class="hljs-number">50px;
<span class="hljs-attribute">margin-top:<span class="hljs-number">120px;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.14 实现一个完整的ToDo-案例</h2>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="970" data-height="1282"><img src="//upload-images.jianshu.io/upload_images/1480597-591bc5ea4d48865d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/970/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>基础版</strong></p>
<pre class="hljs bash"><code class="bash"><span class="hljs-comment"># 创建组件
ng g component components/todo
</span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h2>todoList<span class="hljs-tag"></<span class="hljs-name">h2>
<span class="hljs-tag"><<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"todolist">
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">class=<span class="hljs-string">"form_input" <span class="hljs-attr">type=<span class="hljs-string">"text" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"keyword" (<span class="hljs-attr">keyup)=<span class="hljs-string">"doAdd($event)" />
<span class="hljs-tag"><<span class="hljs-name">hr>
<span class="hljs-tag"><<span class="hljs-name">h3>待办事项<span class="hljs-tag"></<span class="hljs-name">h3>
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of todolist;let key=index;" [<span class="hljs-attr">hidden]=<span class="hljs-string">"item.status==1">
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"checkbox" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"item.status" />{{item.title}} ------ <span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"deleteData(key)">X<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">h3>已完成事项<span class="hljs-tag"></<span class="hljs-name">h3>
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of todolist;let key=index;" [<span class="hljs-attr">hidden]=<span class="hljs-string">"item.status==0">
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"checkbox" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"item.status" />{{item.title}} ------ <span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"deleteData(key)">X<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">import { Component, OnInit } from <span class="hljs-string">'@angular/core';
<span class="hljs-meta">@Component({
selector: <span class="hljs-string">'app-todo',
templateUrl: <span class="hljs-string">'./todo.component.html',
styleUrls: [<span class="hljs-string">'./todo.component.scss']
})
export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">TodoComponent <span class="hljs-keyword">implements <span class="hljs-title">OnInit {
<span class="hljs-keyword">public keyword: string;
<span class="hljs-keyword">public todolist: any[] = [];
constructor() { }
ngOnInit() {
}
doAdd(e){
<span class="hljs-keyword">if(e.keyCode == <span class="hljs-number">13){
<span class="hljs-keyword">if(!<span class="hljs-keyword">this.todolistHasKeyword(<span class="hljs-keyword">this.todolist, <span class="hljs-keyword">this.keyword)){
<span class="hljs-keyword">this.todolist.push({
title: <span class="hljs-keyword">this.keyword,
status: <span class="hljs-number">0 <span class="hljs-comment">//0表示代办事项1表示已完成事项
});
<span class="hljs-keyword">this.keyword=<span class="hljs-string">'';
}<span class="hljs-keyword">else{
alert(<span class="hljs-string">'数据已经存在');
<span class="hljs-keyword">this.keyword=<span class="hljs-string">'';
}
}
}
deleteData(key){
<span class="hljs-keyword">this.todolist.splice(key,<span class="hljs-number">1);
}
<span class="hljs-comment">//如果数组里面有keyword返回true否则返回false
todolistHasKeyword(todolist:any, keyword:any){
<span class="hljs-comment">//异步会存在问题
<span class="hljs-comment">// todolist.forEach(value => {
<span class="hljs-comment">// if(value.title==keyword){
<span class="hljs-comment">// return true;
<span class="hljs-comment">// }
<span class="hljs-comment">// });
<span class="hljs-keyword">if(!keyword)<span class="hljs-keyword">return <span class="hljs-keyword">false;
<span class="hljs-keyword">for(var i=<span class="hljs-number">0; i<todolist.length; i++){
<span class="hljs-keyword">if(todolist.title==keyword){
<span class="hljs-keyword">return <span class="hljs-keyword">true;
}
}
<span class="hljs-keyword">return <span class="hljs-keyword">false;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs scss"><code class="scss">
<span class="hljs-selector-tag">h2{
<span class="hljs-attribute">text-align: center;
}
<span class="hljs-selector-class">.todolist{
<span class="hljs-attribute">width: <span class="hljs-number">400px;
<span class="hljs-attribute">margin: <span class="hljs-number">20px auto;
<span class="hljs-selector-class">.form_input{
<span class="hljs-attribute">margin-bottom: <span class="hljs-number">20px;
<span class="hljs-attribute">width: <span class="hljs-number">300px;
<span class="hljs-attribute">height: <span class="hljs-number">32px;
}
<span class="hljs-selector-tag">li{
<span class="hljs-attribute">line-height: <span class="hljs-number">60px;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>3.15 搜索缓存数据-案例</h2>
<p><strong>基础版</strong></p>
<pre class="hljs bash"><code class="bash"><span class="hljs-comment"># 创建组件
ng g component components/search
</span></code></pre>
<pre class="hljs javascript"><code class="javascript"><div <span class="hljs-class"><span class="hljs-keyword">class=<span class="hljs-string">"search">
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"text" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"keyword" /><span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"doSearch()">搜索<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"><<span class="hljs-name">hr>
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of historyList;let key=index;">{{item}} ------ <span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"deleteHistroy(key)">X<span class="hljs-tag"></<span class="hljs-name">button><span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">import { Component, OnInit } from <span class="hljs-string">'@angular/core';
<span class="hljs-meta">@Component({
selector: <span class="hljs-string">'app-search',
templateUrl: <span class="hljs-string">'./search.component.html',
styleUrls: [<span class="hljs-string">'./search.component.scss']
})
export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">SearchComponent <span class="hljs-keyword">implements <span class="hljs-title">OnInit {
<span class="hljs-keyword">public keyword: string;
<span class="hljs-keyword">public historyList: any[] = [];
constructor() { }
ngOnInit() {
}
doSearch(){
<span class="hljs-keyword">if(<span class="hljs-keyword">this.historyList.indexOf(<span class="hljs-keyword">this.keyword)==-<span class="hljs-number">1){
<span class="hljs-keyword">this.historyList.push(<span class="hljs-keyword">this.keyword);
}
<span class="hljs-keyword">this.keyword = <span class="hljs-string">'';
}
deleteHistroy(key){
alert(key);
<span class="hljs-keyword">this.historyList.splice(key,<span class="hljs-number">1);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs scss"><code class="scss"><span class="hljs-selector-class">.search{
<span class="hljs-attribute">width: <span class="hljs-number">400px;
<span class="hljs-attribute">margin: <span class="hljs-number">20px auto;
<span class="hljs-selector-tag">input{
<span class="hljs-attribute">margin-bottom: <span class="hljs-number">20px;
<span class="hljs-attribute">width: <span class="hljs-number">300px;
<span class="hljs-attribute">height: <span class="hljs-number">32px;
}
<span class="hljs-selector-tag">button{
<span class="hljs-attribute">height: <span class="hljs-number">32px;
<span class="hljs-attribute">width: <span class="hljs-number">80px;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>四、Angular 中的服务</h1>
<h2>4.1 服务</h2>
<blockquote>
<p>定义公共的方法,使得方法在组件之间共享调用</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1512" data-height="648"><img src="//upload-images.jianshu.io/upload_images/1480597-ccc34dcac462199c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>1. 创建服务命令</strong></p>
<pre class="hljs bash"><code class="bash">ng g service my-new-service
<span class="hljs-comment"># 创建到指定目录下面
ng g service services/storage
</span></code></pre>
<p><strong>2. app.module.ts 里面引入创建的服务</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// app.module.ts 里面引入创建的服务
<span class="hljs-keyword">import { StorageService } <span class="hljs-keyword">from <span class="hljs-string">'./services/storage.service';
</span></span></span></span></code></pre>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-comment">// NgModule 里面的 providers 里面依赖注入服务
NgModule({
declarations: [
AppComponent,
HeaderComponent,
FooterComponent,
NewsComponent,
TodolistComponent
], imports: [
BrowserModule,
FormsModule
],
providers: ,
bootstrap:
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppModule { }
</span></span></span></span></span></code></pre>
<p><strong>3. 使用的页面引入服务,注册服务</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import { StorageService } <span class="hljs-keyword">from <span class="hljs-string">'../../services/storage.service';
</span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">constructor(private storage: StorageService) {
}
</span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// 使用
addData(){
<span class="hljs-comment">// alert(this.username);
<span class="hljs-keyword">this.list.push(<span class="hljs-keyword">this.username);
<span class="hljs-keyword">this.storage.set(<span class="hljs-string">'todolist',<span class="hljs-keyword">this.list);
}
removerData(key){
<span class="hljs-built_in">console.log(key);
<span class="hljs-keyword">this.list.splice(key,<span class="hljs-number">1);
<span class="hljs-keyword">this.storage.set(<span class="hljs-string">'todolist',<span class="hljs-keyword">this.list);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>4.2 改造上面的Todo、searchList</h2>
<p><strong>searchList</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, OnInit } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-comment">// 引入服务
<span class="hljs-keyword">import { StorageService } <span class="hljs-keyword">from <span class="hljs-string">'../../services/storage.service';
@Component({
<span class="hljs-attr">selector: <span class="hljs-string">'app-search',
<span class="hljs-attr">templateUrl: <span class="hljs-string">'./search.component.html',
<span class="hljs-attr">styleUrls: [<span class="hljs-string">'./search.component.scss']
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">SearchComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
public keyword: string;
public historyList: any[] = [];
<span class="hljs-keyword">constructor(public storage: StorageService) {
<span class="hljs-built_in">console.log(<span class="hljs-keyword">this.storage.get());
}
ngOnInit() {
<span class="hljs-comment">// 修改的地方
<span class="hljs-keyword">var searchlist:any=<span class="hljs-keyword">this.storage.get(<span class="hljs-string">'searchlist');
<span class="hljs-keyword">if(searchlist){
<span class="hljs-keyword">this.historyList=searchlist;
}
}
doSearch(){
<span class="hljs-keyword">if(<span class="hljs-keyword">this.historyList.indexOf(<span class="hljs-keyword">this.keyword)==<span class="hljs-number">-1){
<span class="hljs-keyword">this.historyList.push(<span class="hljs-keyword">this.keyword);
<span class="hljs-comment">// 修改的地方
<span class="hljs-keyword">this.storage.set(<span class="hljs-string">'searchlist',<span class="hljs-keyword">this.historyList);
}
<span class="hljs-keyword">this.keyword = <span class="hljs-string">'';
}
deleteHistroy(key){
alert(key);
<span class="hljs-keyword">this.historyList.splice(key,<span class="hljs-number">1);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>TODOLIST</strong></p>
<pre class="hljs javascript"><code class="javascript">ngOnInit() {
<span class="hljs-comment">// 修改的地方
<span class="hljs-keyword">var todolist:any=<span class="hljs-keyword">this.storage.get(<span class="hljs-string">'todolist');
<span class="hljs-keyword">if(todolist){
<span class="hljs-keyword">this.todolist=todolist;
}
}
doAdd(e){
<span class="hljs-keyword">if(e.keyCode==<span class="hljs-number">13){
<span class="hljs-keyword">if(!<span class="hljs-keyword">this.todolistHasKeyword(<span class="hljs-keyword">this.todolist,<span class="hljs-keyword">this.keyword)){
<span class="hljs-keyword">this.todolist.push({
<span class="hljs-attr">title:<span class="hljs-keyword">this.keyword,
<span class="hljs-attr">status:<span class="hljs-number">0 <span class="hljs-comment">//0表示代办事项1表示已完成事项
});
<span class="hljs-keyword">this.keyword=<span class="hljs-string">'';
<span class="hljs-comment">// 修改的地方
<span class="hljs-keyword">this.storage.set(<span class="hljs-string">'todolist',<span class="hljs-keyword">this.todolist); <span class="hljs-comment">//用到this一定要注意this指向
}<span class="hljs-keyword">else{
alert(<span class="hljs-string">'数据已经存在');
<span class="hljs-keyword">this.keyword=<span class="hljs-string">'';
}
}
}
<span class="hljs-comment">// 修改的地方
checkboxChange(){
<span class="hljs-built_in">console.log(<span class="hljs-string">'事件触发了');
<span class="hljs-keyword">this.storage.set(<span class="hljs-string">'todolist',<span class="hljs-keyword">this.todolist);
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h2>todoList<span class="hljs-tag"></<span class="hljs-name">h2>
<span class="hljs-tag"><<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"todolist">
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">class=<span class="hljs-string">"form_input" <span class="hljs-attr">type=<span class="hljs-string">"text" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"keyword" (<span class="hljs-attr">keyup)=<span class="hljs-string">"doAdd($event)" />
<span class="hljs-tag"><<span class="hljs-name">hr>
<span class="hljs-tag"><<span class="hljs-name">h3>待办事项<span class="hljs-tag"></<span class="hljs-name">h3>
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of todolist;let key=index;" [<span class="hljs-attr">hidden]=<span class="hljs-string">"item.status==1">
<span class="hljs-comment"><!-- add checkboxChange-->
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"checkbox" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"item.status"(<span class="hljs-attr">change)=<span class="hljs-string">"checkboxChange()"/>{{item.title}} ------ <span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"deleteData(key)">X<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">h3>已完成事项<span class="hljs-tag"></<span class="hljs-name">h3>
<span class="hljs-tag"><<span class="hljs-name">ul>
<span class="hljs-tag"><<span class="hljs-name">li *<span class="hljs-attr">ngFor=<span class="hljs-string">"let item of todolist;let key=index;" [<span class="hljs-attr">hidden]=<span class="hljs-string">"item.status==0">
<span class="hljs-comment"><!-- add checkboxChange-->
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"checkbox" [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"item.status" (<span class="hljs-attr">change)=<span class="hljs-string">"checkboxChange()" />{{item.title}} ------ <span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"deleteData(key)">X<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"></<span class="hljs-name">li>
<span class="hljs-tag"></<span class="hljs-name">ul>
<span class="hljs-tag"></<span class="hljs-name">div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>五、Dom 操作以及@ViewChild、 执行 css3 动画</h1>
<p><strong>1. Angular 中的 dom 操作(原生 js)</strong></p>
<pre class="hljs javascript"><code class="javascript">ngAfterViewInit(){
<span class="hljs-keyword">var boxDom:any=<span class="hljs-built_in">document.getElementById(<span class="hljs-string">'box'); boxDom.style.color=<span class="hljs-string">'red';
}
</span></span></span></span></code></pre>
<p><strong>2. Angular 中的 dom 操作(ViewChild)</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import { Component ,ViewChild,ElementRef} <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
</span></span></span></code></pre>
<pre class="hljs css"><code class="css"> @<span class="hljs-keyword">ViewChild('<span class="hljs-keyword">myattr') myattr: ElementRef;
</span></span></code></pre>
<pre class="hljs cpp"><code class="cpp"><div <span class="hljs-meta">#myattr><span class="hljs-meta-string"></div>
</span></span></code></pre>
<pre class="hljs javascript"><code class="javascript">ngAfterViewInit(){
<span class="hljs-keyword">let attrEl = <span class="hljs-keyword">this.myattr.nativeElement;
}
</span></span></code></pre>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="744" data-height="1230"><img src="//upload-images.jianshu.io/upload_images/1480597-1adb55ae5489a80f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/744/format/webp"></div>
</div>
<div class="image-caption">@viewChild</div>
</div>
<p><strong>3. 父子组件中通过 ViewChild 调用子组件 的方法</strong></p>
<blockquote>
<p>调用子组件给子组件定义一个名称</p>
</blockquote>
<pre class="hljs objectivec"><code class="objectivec"><app-footer <span class="hljs-meta">#footerChild><span class="hljs-meta-string"></app-footer>
</span></span></code></pre>
<blockquote>
<p>引入 <code>ViewChild</code></p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import { Component, OnInit ,ViewChild} <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
</span></span></span></code></pre>
<blockquote>
<p><code>ViewChild</code> 和刚才的子组件关联起来</p>
</blockquote>
<pre class="hljs java"><code class="java"> <span class="hljs-meta">@ViewChild(<span class="hljs-string">'footerChild') footer
</span></span></code></pre>
<blockquote>
<p>在父组件中调用子组件方法</p>
</blockquote>
<pre class="hljs cpp"><code class="cpp"> run(){
<span class="hljs-keyword">this.footer.footerRun();
}
</span></code></pre>
<h1>六、Angular 父子组件以及组件之间通讯</h1>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="2592" data-height="1108"><img src="//upload-images.jianshu.io/upload_images/1480597-8d19e6351e1c58a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">父子组件通讯</div>
</div>
<h2>6.1 父组件给子组件传值-@input</h2>
<blockquote>
<p>父组件不仅可以给子组件传递简单的数据,还可把自己的方法以及整个父组件传给子组件</p>
</blockquote>
<p><strong>1. 父组件调用子组件的时候传入数据</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">app-header [<span class="hljs-attr">msg]=<span class="hljs-string">"msg"><span class="hljs-tag"></<span class="hljs-name">app-header>
</span></span></span></span></span></span></code></pre>
<p><strong>2. 子组件引入 Input 模块</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, OnInit ,Input } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
</span></span></span></code></pre>
<p><strong>3. 子组件中 @Input 接收父组件传过来的数据</strong></p>
<pre class="hljs java"><code class="java">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">HeaderComponent <span class="hljs-keyword">implements <span class="hljs-title">OnInit {
<span class="hljs-meta">@Input() msg:<span class="hljs-function">string
<span class="hljs-title">constructor<span class="hljs-params">() { }
ngOnInit() {
}
}
</span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>4. 子组件中使用父组件的数据</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">p>
child works!
{{msg}}
<span class="hljs-tag"></<span class="hljs-name">p>
</span></span></span></span></code></pre>
<p><strong>5. 把整个父组件传给子组件</strong></p>
<blockquote>
<p>通过<code>this</code>传递整个组件实例</p>
</blockquote>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">app-header [<span class="hljs-attr">home]=<span class="hljs-string">"this"><span class="hljs-tag"></<span class="hljs-name">app-header>
</span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">HeaderComponent <span class="hljs-keyword">implements <span class="hljs-title">OnInit {
<span class="hljs-meta">@Input() home:<span class="hljs-function">any
<span class="hljs-title">constructor<span class="hljs-params">() { }
ngOnInit() {
}
}
</span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>执行父组件方法 <code>this.home.xxx()</code></p>
</blockquote>
<h2>6.2 子组件通过@Output 触发父组件的方法(了解)</h2>
<p><strong>1. 子组件引入 Output 和 EventEmitter</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import { Component, OnInit ,Input,Output,EventEmitter} <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
</span></span></span></code></pre>
<p><strong>2. 子组件中实例化 EventEmitter</strong></p>
<pre class="hljs cpp"><code class="cpp">@Output() <span class="hljs-keyword">private outer=<span class="hljs-keyword">new EventEmitter<<span class="hljs-built_in">string>(); <span class="hljs-comment">/*用EventEmitter和output装饰器配合使用 <string>指定类型变量*/
</span></span></span></span></code></pre>
<p><strong>3. 子组件通过 EventEmitter 对象 outer 实例广播数据</strong></p>
<pre class="hljs java"><code class="java">sendParent(){
<span class="hljs-comment">// alert('zhixing');
<span class="hljs-keyword">this.outer.emit(<span class="hljs-string">'msg from child')
}
</span></span></span></code></pre>
<p><strong>4. 父组件调用子组件的时候,定义接收事件 , outer 就是子组件的 EventEmitter 对象 outer</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-comment"><!--$event就是子组件emit传递的数据-->
<span class="hljs-tag"><<span class="hljs-name">app-header (<span class="hljs-attr">outer)=<span class="hljs-string">"runParent($event)"><span class="hljs-tag"></<span class="hljs-name">app-header>
</span></span></span></span></span></span></span></code></pre>
<p><strong>5. 父组件接收到数据会调用自己的 runParent 方法,这个时候就能拿到子组件的数据</strong></p>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-comment">//接收子组件传递过来的数据
runParent(msg:<span class="hljs-built_in">string){
alert(msg);
}
</span></span></code></pre>
<h2>6.3 父组件通过@ViewChild 主动获取子组 件的数据和方法</h2>
<p><strong>1. 调用子组件给子组件定义一个名称</strong></p>
<pre class="hljs objectivec"><code class="objectivec"><app-footer <span class="hljs-meta">#footerChild><span class="hljs-meta-string"></app-footer>
</span></span></code></pre>
<p><strong>2. 引入 ViewChild</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, OnInit ,ViewChild} <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
</span></span></span></code></pre>
<p><strong>3. ViewChild 和刚才的子组件关联起来</strong></p>
<pre class="hljs css"><code class="css"> @<span class="hljs-keyword">ViewChild('<span class="hljs-keyword">footerChild') footer;
</span></span></code></pre>
<p><strong>4. 调用子组件</strong></p>
<pre class="hljs cpp"><code class="cpp">run(){ <span class="hljs-keyword">this.footer.footerRun();
}
</span></code></pre>
<h2>6.4 非父子组件通讯</h2>
<ul>
<li>公共的服务</li>
<li><code>Localstorage</code> (推荐)</li>
<li><code>Cookie</code></li>
</ul>
<h1>七、Angular 中的生命周期函数</h1>
<h2>7.1 Angular中的生命周期函数</h2>
<blockquote>
<p>官方文档:https://www.angular.cn/guide/lifecycle-hooks</p>
</blockquote>
<ul>
<li>生命周期函数通俗的讲就是组件创建、组件更新、组件销毁的时候会触发的一系列的方法。</li>
<li>当 <code>Angular</code> 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些 生命周期钩子方法。</li>
<li>每个接口都有唯一的一个钩子方法,它们的名字是由接口名再加上<code>ng</code>前缀构成的,比如<code>OnInit</code>接口的钩子方法叫做<code>ngOnInit</code>.</li>
</ul>
<p><strong>1. 生命周期钩子分类</strong></p>
<blockquote>
<p>基于指令与组件的区别来分类</p>
</blockquote>
<p><strong>指令与组件共有的钩子</strong></p>
<ul>
<li><code>ngOnChanges</code></li>
<li><code>ngOnInit</code></li>
<li><code>ngDoCheck</code></li>
<li><code>ngOnDestroy</code></li>
</ul>
<p><strong>组件特有的钩子</strong></p>
<ul>
<li><code>ngAfterContentInit</code></li>
<li><code>ngAfterContentChecked</code></li>
<li><code>ngAfterViewInit</code></li>
<li><code>ngAfterViewChecked</code></li>
</ul>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="218" data-height="309"><img src="//upload-images.jianshu.io/upload_images/1480597-417f04c277eef749.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/218/format/webp"></div>
</div>
<div class="image-caption">生命周期钩子</div>
</div>
<p><strong>2. 生命周期钩子的作用及调用顺序</strong></p>
<p>1、<code>ngOnChanges</code> - 当数据绑定输入属性的值发生变化时调用<br>
2、<code>ngOnInit</code> - 在第一次 <code>ngOnChanges</code> 后调用<br>
3、<code>ngDoCheck</code> - 自定义的方法,用于检测和处理值的改变<br>
4、<code>ngAfterContentInit</code> - 在组件内容初始化之后调用<br>
5、<code>ngAfterContentChecked</code> - 组件每次检查内容时调用<br>
6、<code>ngAfterViewInit</code> - 组件相应的视图初始化之后调用<br>
7、<code>ngAfterViewChecked</code> - 组件每次检查视图时调用<br>
8、<code>ngOnDestroy</code> - 指令销毁前调用</p>
<p><strong>3. 首次加载生命周期顺序</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">LifecircleComponent {
<span class="hljs-keyword">constructor() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'00构造函数执行了---除了使用简单的值对局部变量进行初始化之外,什么都不应该做')
}
ngOnChanges() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'01ngOnChages执行了---当被绑定的输入属性的值发生变化时调用(父子组件传值的时候会触发)');
}
ngOnInit() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'02ngOnInit执行了--- 请求数据一般放在这个里面');
}
ngDoCheck() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'03ngDoCheck执行了---检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应');
}
ngAfterContentInit() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'04ngAfterContentInit执行了---当把内容投影进组件之后调用');
}
ngAfterContentChecked() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'05ngAfterContentChecked执行了---每次完成被投影组件内容的变更检测之后调用');
}
ngAfterViewInit() : <span class="hljs-keyword">void {
<span class="hljs-built_in">console.log(<span class="hljs-string">'06 ngAfterViewInit执行了----初始化完组件视图及其子视图之后调用(dom操作放在这个里面)');
}
ngAfterViewChecked() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'07ngAfterViewChecked执行了----每次做完组件视图和子视图的变更检测之后调用');
}
ngOnDestroy() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'08ngOnDestroy执行了····');
}
<span class="hljs-comment">//自定义方法
changeMsg() {
<span class="hljs-keyword">this.msg = <span class="hljs-string">"数据改变了";
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="2518" data-height="714"><img src="//upload-images.jianshu.io/upload_images/1480597-7e0081f4616fe461.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">生命周期调用顺序</div>
</div>
<blockquote>
<p>带<code>check</code>的可以对数据做响应操作</p>
</blockquote>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">button (<span class="hljs-attr">click)=<span class="hljs-string">"changeMsg()">数据改变了<span class="hljs-tag"></<span class="hljs-name">button>
<span class="hljs-tag"><<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">'text' [(<span class="hljs-attr">ngModel)]=<span class="hljs-string">"userInfo" />
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>点击按钮/双向数据绑定此时触发了以下生命周期。只要数据改变</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1096" data-height="222"><img src="//upload-images.jianshu.io/upload_images/1480597-158cdd9fe4f9f028.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">cheked</div>
</div>
<blockquote>
<p>可以在<code>check</code>做一些操作</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript">ngDoCheck() {
<span class="hljs-comment">//写一些自定义的操作
<span class="hljs-built_in">console.log(<span class="hljs-string">'03ngDoCheck执行了---检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应');
<span class="hljs-keyword">if(<span class="hljs-keyword">this.userinfo!==<span class="hljs-keyword">this.oldUserinfo){
<span class="hljs-built_in">console.log(<span class="hljs-string">`你从<span class="hljs-subst">${<span class="hljs-keyword">this.oldUserinfo}改成<span class="hljs-subst">${<span class="hljs-keyword">this.userinfo}`);
<span class="hljs-keyword">this.oldUserinfo = <span class="hljs-keyword">this.userinfo;
}<span class="hljs-keyword">else{
<span class="hljs-built_in">console.log(<span class="hljs-string">"数据没有变化");
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>7.2 生命周期钩子详解</h2>
<h3>7.2.1 constructor-掌握</h3>
<blockquote>
<p><code>constructor</code>,来初始化类。<code>Angular</code>中的组件就是基于<code>class</code>类实现的,在<code>Angular</code>中,<code>constructor</code>用于注入依赖。组件的构造函数会在所有的生命周期钩子之前被调用,它主要用于依赖注入或执行简单的数据初始化操作。</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, ElementRef } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
@Component({
<span class="hljs-attr">selector: <span class="hljs-string">'my-app',
<span class="hljs-attr">template: <span class="hljs-string">`
<h1>Welcome to Angular World</h1>
<p>Hello {{name}}</p>
`,
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AppComponent {
name: string = <span class="hljs-string">'';
<span class="hljs-keyword">constructor(public elementRef: ElementRef) {<span class="hljs-comment">//使用构造注入的方式注入依赖对象
<span class="hljs-comment">// 执行初始化操作
<span class="hljs-keyword">this.name = <span class="hljs-string">'Semlinker';
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3>7.2.2 ngOnChanges()</h3>
<blockquote>
<p>当 <code>Angular</code>(重新)设置数据绑定输入属性时响应。该 方法接受当前和上一属性值的 <code>SimpleChanges</code> 对象 当被绑定的输入属性的值发生变化时调用,首次调用一 定会发生在 <code>ngOnInit()</code>之前。</p>
</blockquote>
<pre class="hljs xml"><code class="xml"><span class="hljs-comment"><!-- 父组件中 传递title属性给header子组件 -->
<span class="hljs-tag"><<span class="hljs-name">app-header [<span class="hljs-attr">title]=<span class="hljs-string">"title"><span class="hljs-tag"></<span class="hljs-name">app-header>
</span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>此时改变<code>title</code>会触发<code>ngOnChanges</code>生命周期,并且也会触发</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="1096" data-height="222"><img src="//upload-images.jianshu.io/upload_images/1480597-158cdd9fe4f9f028.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp"></div>
</div>
<div class="image-caption">cheked</div>
</div>
<h3>7.2.3 ngOnInit()--掌握</h3>
<blockquote>
<p>在 <code>Angular</code> 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。在第一轮 <code>ngOnChanges()</code> 完成之后调用,只调用一次。可以请求数据</p>
</blockquote>
<ul>
<li><strong>使用 ngOnInit() 有两个原因</strong>:
<ul>
<li>在构造函数之后马上执行复杂的初始化逻辑</li>
<li>在 <code>Angular</code> 设置完输入属性之后,对该组件进行准备。有经验的开发者会认同组件的构建应该很便宜和安全</li>
</ul>
</li>
</ul>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Component, Input, OnInit } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
@Component({
<span class="hljs-attr">selector: <span class="hljs-string">'exe-child',
<span class="hljs-attr">template: <span class="hljs-string">`
<p>父组件的名称:{{pname}} </p>
`
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ChildComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
@Input()
pname: string; <span class="hljs-comment">// 父组件的名称
<span class="hljs-keyword">constructor() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'ChildComponent constructor', <span class="hljs-keyword">this.pname);
<span class="hljs-comment">// Output:undefined
}
ngOnInit() {
<span class="hljs-built_in">console.log(<span class="hljs-string">'ChildComponent ngOnInit', <span class="hljs-keyword">this.pname);
<span class="hljs-comment">// output: 输入的pname值
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3>7.2.4 ngDoCheck()</h3>
<blockquote>
<p>检测,并在发生 <code>Angular</code> 无法或不愿意自己检测的变 化时作出反应。在每个 <code>Angular</code> 变更检测周期中调用, <code>ngOnChanges()</code> 和 <code>ngOnInit()</code>之后。</p>
</blockquote>
<h3>7.2.5 ngAfterContentInit()</h3>
<blockquote>
<p>当把内容投影进组件之后调用。第一次 <code>ngDoCheck()</code> 之后调用,只调用一次</p>
</blockquote>
<h3>7.2.6 ngAfterContentChecked()</h3>
<blockquote>
<p>每次完成被投影组件内容的变更检测之后调用。 <code>ngAfterContentInit()</code> 和每次 <code>ngDoCheck()</code> 之后调</p>
</blockquote>
<h3>7.2.7 ngAfterViewInit()--掌握</h3>
<blockquote>
<p>初始化完组件视图及其子视图之后调用。第一 次 <code>ngAfterContentChecked()</code> 之后调用,只调用一次。在这里可以操作<code>DOM</code></p>
</blockquote>
<h3>7.2.8 ngAfterViewChecked()</h3>
<blockquote>
<p>每次做完组件视图和子视图的变更检测之后调用。 <code>ngAfterViewInit()</code>和每次 <code>ngAfterContentChecked()</code> 之后 调用。</p>
</blockquote>
<h3>7.2.9 ngOnDestroy()--掌握</h3>
<blockquote>
<p>当 <code>Angular</code> 每次销毁指令/组件之前调用并清扫。在这儿反订阅可观察对象和分离事件处理器,以防内存泄 漏。在 <code>Angular</code> 销毁指令/组件之前调用。比如:移除事件监听、清除定时器、退订 <code>Observable</code> 等。</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript">@Directive({
<span class="hljs-attr">selector: <span class="hljs-string">''
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">OnDestroyDirective <span class="hljs-title">implements <span class="hljs-title">OnDestroy {
sayHello: number;
<span class="hljs-keyword">constructor() {
<span class="hljs-keyword">this.sayHiya = <span class="hljs-built_in">window.setInterval(<span class="hljs-function"><span class="hljs-params">() => <span class="hljs-built_in">console.log(<span class="hljs-string">'hello'), <span class="hljs-number">1000);
}
ngOnDestroy() {
<span class="hljs-built_in">window.clearInterval(<span class="hljs-keyword">this.sayHiya);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>八、Rxjs 异步数据流编程</h1>
<h2>8.1 Rxjs介绍</h2>
<blockquote>
<ul>
<li>参考手册:https://www.npmjs.com/package/rxjs</li>
<li>中文手册:https://cn.rx.js.org/</li>
</ul>
</blockquote>
<blockquote>
<p><code>RxJS</code> 是 <code>ReactiveX</code> 编程理念的 <code>JavaScript</code> 版本。<code>ReactiveX</code> 来自微软,它是一种针对异步数据 流的编程。简单来说,它将一切数据,包括 <code>HTTP</code> 请求,<code>DOM</code> 事件或者普通数据等包装成流的形式,然后用强大丰富的操作符对流进行处理,使你能以同步编程的方式处理异步数据,并组合不同的操作符来轻松优雅的实现你所需要的功能。</p>
</blockquote>
<ul>
<li><code>RxJS</code> 是一种针对异步数据流编程工具,或者叫响应式扩展编程;可不管如何解释 RxJS 其目 标就是异步编程,<code>Angular</code> 引入 <code>RxJS</code> 为了就是让异步可控、更简单。</li>
<li><code>RxJS</code> 里面提供了很多模块。这里我们主要给大家讲 <code>RxJS</code> 里面最常用的<code>Observable</code> 和 f<code>romEvent</code></li>
</ul>
<p><strong>目前常见的异步编程的几种方法:</strong></p>
<ul>
<li>回调函数</li>
<li>事件监听/发布订阅</li>
<li><code>Promise</code></li>
<li><code>Rxjs</code></li>
</ul>
<h2>8.2 Promise和RxJS处理异步对比</h2>
<blockquote>
<p>新建一个<code>services</code></p>
</blockquote>
<pre class="hljs bash"><code class="bash">ng g service services/rxjs
</code></pre>
<blockquote>
<p>在<code>services/rxjs.service.ts</code>中写以下方法</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Injectable } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-keyword">import { Observable } <span class="hljs-keyword">from <span class="hljs-string">'rxjs';
@Injectable({
<span class="hljs-attr">providedIn: <span class="hljs-string">'root'
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">RxjsService {
<span class="hljs-keyword">constructor() { }
<span class="hljs-comment">// Promise 处理异步
getPromiseData() {
<span class="hljs-keyword">return <span class="hljs-keyword">new <span class="hljs-built_in">Promise(resolve = >{
setTimeout(() = >{
resolve(<span class="hljs-string">'---promise timeout---');
},
<span class="hljs-number">2000);
});
<span class="hljs-comment">// RxJS 处理异步:
getRxjsData() {
<span class="hljs-keyword">return <span class="hljs-keyword">new Observable(observer = >{
setTimeout(() = >{
observer.next(<span class="hljs-string">'observable timeout');
},
<span class="hljs-number">2000);
});
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// 在其他组件使用服务
<span class="hljs-keyword">import { Component, OnInit } <span class="hljs-keyword">from <span class="hljs-string">'@angular/core';
<span class="hljs-keyword">import { RxjsService } <span class="hljs-keyword">from <span class="hljs-string">'../../services/rxjs.service';
@Component({
<span class="hljs-attr">selector: <span class="hljs-string">'app-rxjs',
<span class="hljs-attr">templateUrl: <span class="hljs-string">'./rxjs.component.html',
<span class="hljs-attr">styleUrls: [<span class="hljs-string">'./rxjs.component.scss']
})
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">RxjsComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
<span class="hljs-comment">// 注入服务
<span class="hljs-keyword">constructor(public request: RxjsService) {
}
ngOnInit() {
<span class="hljs-comment">// 调用方法
<span class="hljs-keyword">this.request.getRxjsData().subscribe(<span class="hljs-function"><span class="hljs-params">data=>{
<span class="hljs-built_in">console.log(data)
})
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<ul>
<li>从上面列子可以看到 <code>RxJS</code> 和 <code>Promise</code>的基本用法非常类似,除了一些关键词不同。<code>Promise</code> 里面用的是 <code>then()</code> 和 <code>resolve()</code>,而 <code>RxJS</code>里面用的是 <code>next()</code> 和 <code>subscribe()</code></li>
<li><code>Rxjs</code>相比<code>Promise</code>要强大很多。 比如 <code>Rxjs</code> 中可以中途撤回、<code>Rxjs</code> 可以发射多个值、<code>Rxjs</code> 提供了多种工具函数等等</li>
</ul>
<h2>8.3 Rxjs unsubscribe 取消订阅</h2>
<blockquote>
<p><code>Promise</code> 的创建之后,动作是无法撤回的。<code>Observable</code> 不一样,动作可以通过 <code>unsbscribe()</code> 方法中途撤回,而且 <code>Observable</code> 在内部做了智能的处理.</p>
</blockquote>
<p><strong>Promise 创建之后动作无法撤回</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let promise = <span class="hljs-keyword">new <span class="hljs-built_in">Promise(resolve = >{
setTimeout(() = >{
resolve(<span class="hljs-string">'---promise timeout---');
},
<span class="hljs-number">2000);
});
promise.then(value = ><span class="hljs-built_in">console.log(value));
</span></span></span></span></span></span></code></pre>
<p><strong>Rxjs 可以通过 unsubscribe() 可以撤回 subscribe 的动作</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let stream = <span class="hljs-keyword">new Observable(observer = >{
<span class="hljs-keyword">let timeout = setTimeout(() = >{
clearTimeout(timeout);
observer.next(<span class="hljs-string">'observable timeout');
},
<span class="hljs-number">2000);
});
<span class="hljs-keyword">let disposable = stream.subscribe(value = ><span class="hljs-built_in">console.log(value));
setTimeout(() = >{
<span class="hljs-comment">//取消执行 disposable.unsubscribe();
},
<span class="hljs-number">1000);
</span></span></span></span></span></span></span></span></span></code></pre>
<h2>8.4 Rxjs 订阅后多次执行</h2>
<ul>
<li>如果我们想让异步里面的方法多次执行,比如下面代码。</li>
</ul>
<blockquote>
<p>这一点 <code>Promise</code>是做不到的,对于 <code>Promise</code>来说,最终结果要么 <code>resole</code>(兑现)、要么 <code>reject</code> (拒绝),而且都只能触发一次。如果在同一个 <code>Promise</code> 对象上多次调用 <code>resolve</code> 方法, 则会抛异常。而 <code>Observable</code>不一样,它可以不断地触发下一个值,就像 <code>next()</code>这个方法的 名字所暗示的那样。</p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let promise = <span class="hljs-keyword">new <span class="hljs-built_in">Promise(resolve = >{
setInterval(() = >{
resolve(<span class="hljs-string">'---promise setInterval---');
},
<span class="hljs-number">2000);
});
promise.then(value = ><span class="hljs-built_in">console.log(value));
</span></span></span></span></span></span></code></pre>
<p><strong>Rxjs</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let stream = <span class="hljs-keyword">new Observable < number > (observer = >{
<span class="hljs-keyword">let count = <span class="hljs-number">0;
setInterval(() = >{
observer.next(count++);
},
<span class="hljs-number">1000);
});
stream.subscribe(value = ><span class="hljs-built_in">console.log(<span class="hljs-string">"Observable>" + value));
</span></span></span></span></span></span></span></code></pre>
<h2>8.5 Angualr6.x之前使用Rxjs的工具函数 map filter</h2>
<blockquote>
<p>注意:<code>Angular6</code> 以后使用以前的<code>rxjs</code> 方法,必须安装 <code>rxjs-compat</code> 模块才可以使用 <code>map</code>、<code>filter</code> 方法。</p>
</blockquote>
<blockquote>
<p><code>angular6</code> 后官方使用的是 <code>RXJS6</code>的新特性,所以官方给出了一个可以暂时延缓我们不需要修 改 <code>rsjx</code> 代码的办法</p>
</blockquote>
<pre class="hljs bash"><code class="bash">npm install rxjs-compat
</code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {Observable} <span class="hljs-keyword">from <span class="hljs-string">'rxjs'; <span class="hljs-keyword">import <span class="hljs-string">'rxjs/Rx';
</span></span></span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let stream = <span class="hljs-keyword">new Observable < any > (observer = >{
<span class="hljs-keyword">let count = <span class="hljs-number">0;
setInterval(() = >{
observer.next(count++);
},
<span class="hljs-number">1000);
});
stream.filter(val = >val % <span class="hljs-number">2 == <span class="hljs-number">0).subscribe(value = ><span class="hljs-built_in">console.log(<span class="hljs-string">"filter>" + value));
stream.map(value = >{
<span class="hljs-keyword">return value * value
}).subscribe(value = ><span class="hljs-built_in">console.log(<span class="hljs-string">"map>" + value));
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>8.6 Angualr6.x 以后 Rxjs6.x 的变化以及 使用</h2>
<h3>8.6.1 Rxjs 的变化参考</h3>
<blockquote>
<p>从<code>Angular5</code>升级到<code>Angular6</code>, <code>angular6</code>相比较于<code>angular5</code>总体变化不大,但是在<code>RXJS</code>上面却有一些变动,下面给大家讲讲关于<code>Angular6</code>版本升级和<code>RXJS6</code>新特性的讲解</p>
</blockquote>
<p><strong>1. angular6 Angular7中使用以前的rxjs</strong></p>
<blockquote>
<p>对于写了半年多的项目,模块已经很多了,所以不可能在升级到<code>angular6</code>后马上更新所有代码关于<code>RXJS6</code>的新特性,所以官方给出了一个可以暂时延缓我们不需要修改<code>rsjx</code>代码的办法。</p>
</blockquote>
<pre class="hljs undefined"><code class="js">npm install --save rxjs-compat
</code></pre>
<ul>
<li><strong>优点</strong>: 暂时不用改代码,可以一点点地改,直到改完后吧这个包卸掉</li>
<li><strong>缺点</strong>: 对于<code>rxjs6</code>的<code>rename</code>的<code>operator</code>无效,所以,如果有用到<code>rename</code>的<code>API</code>,必须手动修改</li>
</ul>
<p><strong>2. Angular6 以后 RXJS6的变化</strong></p>
<blockquote>
<p><code>RXJS6</code>改变了包的结构,主要变化在 <code>import</code>方式和<code>operator</code>上面以及使用<code>pipe()</code></p>
</blockquote>
<p><strong>2.1 Imports 方式改变</strong></p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="637" data-height="173"><img src="//upload-images.jianshu.io/upload_images/1480597-1cde10680c8b574d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/637/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<blockquote>
<p>从<code>rxjs</code>中类似像导入<code>observable</code> <code>subject</code> 等的不再进一步导入,而是止于<code>rxjs</code>, <code>rxjs6</code>在包的结构上进行了改变</p>
</blockquote>
<p><strong>2.2 operator的改变</strong></p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="625" data-height="229"><img src="//upload-images.jianshu.io/upload_images/1480597-4a44b397ec43e2c8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/625/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<blockquote>
<p>总而言之: 类似于创建之类的用的<code>API</code>都是从<code>rxjs</code>引入的,类似于<code>map</code> 之类的操作都是从<code>rxjs/operators</code>引入的</p>
</blockquote>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="498" data-height="128"><img src="//upload-images.jianshu.io/upload_images/1480597-123266ac988768f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/498/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>2.3 pipeable observable</strong></p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="673" data-height="275"><img src="//upload-images.jianshu.io/upload_images/1480597-bacc3d7dfc4d6ca4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<p><strong>2.4 被重新命名的API</strong></p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="589" data-height="366"><img src="//upload-images.jianshu.io/upload_images/1480597-0063669c8de12ebc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/589/format/webp"></div>
</div>
<div class="image-caption">image.png</div>
</div>
<blockquote>
<p><code>RXJS6</code> 改变了包的结构,主要变化在 <code>import</code> 方式和 <code>operator</code> 上面以及使用 <code>pipe()</code></p>
</blockquote>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {Observable} <span class="hljs-keyword">from <span class="hljs-string">'rxjs';
<span class="hljs-keyword">import {map,filter} <span class="hljs-keyword">from <span class="hljs-string">'rxjs/operators';
</span></span></span></span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">let stream= <span class="hljs-keyword">new Observable<any>(<span class="hljs-function"><span class="hljs-params">observer => {
<span class="hljs-keyword">let count = <span class="hljs-number">0;
setInterval(() = >{
observer.next(count++);
},
<span class="hljs-number">1000);
});
stream.pipe(filter(val = >val % <span class="hljs-number">2 == <span class="hljs-number">0))
.subscribe(value = ><span class="hljs-built_in">console.log(<span class="hljs-string">"filter>" + value));
stream
.pipe(
filter(val = >val % <span class="hljs-number">2 == <span class="hljs-number">0),
map(value = >{
<span class="hljs-keyword">return value * value
}))
.subscribe(value = ><span class="hljs-built_in">console.log(<span class="hljs-string">"map>" + value));
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>8.7 Rxjs 延迟执行</h2>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {
Observable,
fromEvent
}
<span class="hljs-keyword">from <span class="hljs-string">'rxjs';
<span class="hljs-keyword">import {
map,
filter,
throttleTime
}
<span class="hljs-keyword">from <span class="hljs-string">'rxjs/operators';
<span class="hljs-keyword">var button = <span class="hljs-built_in">document.querySelector(<span class="hljs-string">'button');
fromEvent(button, <span class="hljs-string">'click')
.pipe(throttleTime(<span class="hljs-number">1000))
.subscribe(() = ><span class="hljs-built_in">console.log(<span class="hljs-string">`Clicked`));
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>九、Angular 中的数据交互(get jsonp post)</h1>
<h2>9.1 Angular get 请求数据</h2>
<blockquote>
<p><code>Angular5.x</code> 以后 <code>get</code>、<code>post</code> 和和服务器交互使用的是 <code>HttpClientModule</code> 模块。</p>
</blockquote>
<p><strong>1. 在 app.module.ts 中引入 HttpClientModule 并注入</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {HttpClientModule} <span class="hljs-keyword">from <span class="hljs-string">'@angular/common/http';
</span></span></span></code></pre>
<pre class="hljs undefined"><code class="js">imports: [
BrowserModule,
HttpClientModule
]
</code></pre>
<p><strong>2. 在用到的地方引入 HttpClient 并在构造函数声明</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {HttpClient} <span class="hljs-keyword">from <span class="hljs-string">"@angular/common/http";
<span class="hljs-keyword">constructor(public http:HttpClient) { }
</span></span></span></span></code></pre>
<p><strong>3. get 请求数据</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">var api = <span class="hljs-string">"http://a.itying.com/api/productlist";
<span class="hljs-keyword">this.http.get(api).subscribe(<span class="hljs-function"><span class="hljs-params">response => {
<span class="hljs-built_in">console.log(response); });
</span></span></span></span></span></span></code></pre>
<h2>9.2 Angular post 提交数据</h2>
<blockquote>
<p><code>Angular5.x</code> 以后 <code>get</code>、<code>post</code> 和和服务器交互使用的是<code>HttpClientModule</code> 模块。</p>
</blockquote>
<p><strong>1. 在 app.module.ts 中引入 HttpClientModule 并注入</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {HttpClientModule} <span class="hljs-keyword">from <span class="hljs-string">'@angular/common/http';
imports: [
BrowserModule,
HttpClientModule
]
</span></span></span></code></pre>
<p><strong>2. 在用到的地方引入 HttpClient、HttpHeaders 并在构造函数声明 HttpClient</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {HttpClient,HttpHeaders} <span class="hljs-keyword">from <span class="hljs-string">"@angular/common/http";
<span class="hljs-keyword">constructor(public http:HttpClient) { }
</span></span></span></span></code></pre>
<p><strong>3. post 提交数据</strong></p>
<blockquote>
<p>用<code>express</code>搭建一个<code>server</code></p>
</blockquote>
<pre class="hljs cpp"><code class="cpp"><span class="hljs-comment">// package.json
{
<span class="hljs-string">"dependencies": {
<span class="hljs-string">"ejs": <span class="hljs-string">"^2.5.6",
<span class="hljs-string">"express": <span class="hljs-string">"^4.15.3",
<span class="hljs-string">"socket.io": <span class="hljs-string">"^2.0.3",
<span class="hljs-string">"body-parser": <span class="hljs-string">"~1.17.1"
}
}
</span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// app.js 代码
<span class="hljs-keyword">var express = <span class="hljs-built_in">require(<span class="hljs-string">'express');
<span class="hljs-keyword">var app=express();
<span class="hljs-keyword">var bodyParser = <span class="hljs-built_in">require(<span class="hljs-string">'body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ <span class="hljs-attr">extended: <span class="hljs-literal">false }));
<span class="hljs-comment">/*express允许跨域*/
app.all(<span class="hljs-string">'*', <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">req, res, next) {
res.header(<span class="hljs-string">"Access-Control-Allow-Origin", <span class="hljs-string">"*");
res.header(<span class="hljs-string">"Access-Control-Allow-Headers", <span class="hljs-string">"Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header(<span class="hljs-string">"Access-Control-Allow-Methods",<span class="hljs-string">"PUT,POST,GET,DELETE,OPTIONS");
res.header(<span class="hljs-string">"X-Powered-By",<span class="hljs-string">' 3.2.1')
<span class="hljs-keyword">if(req.method==<span class="hljs-string">"OPTIONS") res.send(<span class="hljs-number">200);
<span class="hljs-keyword">elsenext();
});
<span class="hljs-comment">//app.use(express.static(path.join(__dirname, 'public')));
app.get(<span class="hljs-string">'/',<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">req,res){
res.send(<span class="hljs-string">'首页');
})
app.post(<span class="hljs-string">'/dologin',<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">req,res){
<span class="hljs-built_in">console.log(req.body);
res.json({<span class="hljs-string">"msg":<span class="hljs-string">'post成功'});
})
app.get(<span class="hljs-string">'/news',<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">req,res){
<span class="hljs-comment">//console.log(req.body);
res.jsonp({<span class="hljs-string">"msg":<span class="hljs-string">'这是新闻数据'});
})
app.listen(<span class="hljs-number">3000,<span class="hljs-string">'127.0.0.1',<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){
<span class="hljs-built_in">console.log(<span class="hljs-string">'项目启动在3000端口')
});
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// angular代码
doLogin() {
<span class="hljs-comment">// 手动设置请求类型
<span class="hljs-keyword">const httpOptions = {
<span class="hljs-attr">headers: <span class="hljs-keyword">new HttpHeaders({
<span class="hljs-string">'Content-Type': <span class="hljs-string">'application/json'
})
};
<span class="hljs-keyword">var api = <span class="hljs-string">"http://127.0.0.1:3000/doLogin";
<span class="hljs-keyword">this.http.post(api, {
<span class="hljs-attr">username: <span class="hljs-string">'张三',
<span class="hljs-attr">age: <span class="hljs-string">'20'
},
httpOptions).subscribe(response = >{
<span class="hljs-built_in">console.log(response);
});
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>9.3 Angular Jsonp 请求数据</h2>
<p><strong>1. 在 app.module.ts 中引入 HttpClientModule、HttpClientJsonpModule 并注入</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import {HttpClientModule,HttpClientJsonpModule} <span class="hljs-keyword">from <span class="hljs-string">'@angular/common/http';
</span></span></span></code></pre>
<pre class="hljs undefined"><code class="js">imports: [
BrowserModule,
HttpClientModule,
HttpClientJsonpModule
]
</code></pre>
<p><strong>3. 在用到的地方引入 HttpClient 并在构造函数声明</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import {HttpClient} <span class="hljs-keyword">from <span class="hljs-string">"@angular/common/http";
<span class="hljs-keyword">constructor(public http:HttpClient) { }
</span></span></span></span></code></pre>
<p><strong>3. jsonp 请求数据</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// 接口支持jsonp请求
<span class="hljs-keyword">var api = <span class="hljs-string">"http://a.itying.com/api/productlist";
<span class="hljs-keyword">this.http.jsonp(api,<span class="hljs-string">'callback').subscribe(<span class="hljs-function"><span class="hljs-params">response => {
<span class="hljs-built_in">console.log(response); });
</span></span></span></span></span></span></span></span></code></pre>
<h2>9.4 Angular 中使用第三方模块 axios 请求数据</h2>
<p><strong>1. 安装 axios</strong></p>
<pre class="hljs undefined"><code class="js">cnpm install axios --save
</code></pre>
<p><strong>2. 用到的地方引入 axios</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import axios <span class="hljs-keyword">from <span class="hljs-string">'axios';
</span></span></span></code></pre>
<p><strong>3. 看文档使用</strong></p>
<pre class="hljs javascript"><code class="javascript">axios.get(<span class="hljs-string">'/user?ID=12345').then(<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">response) {
<span class="hljs-comment">// handle success
<span class="hljs-built_in">console.log(response);
}).
catch(<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">error) {
<span class="hljs-comment">// handle error console.log(error);
}).then(<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
<span class="hljs-comment">// always executed
});
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>十、Angular 中的路由</h1>
<h2>10.1 Angular 创建一个默认带路由的项目</h2>
<p><strong>1. 命令创建项目</strong></p>
<pre class="hljs cpp"><code class="cpp">ng <span class="hljs-keyword">new angualrdemo08 --skip-install
</span></code></pre>
<p><strong>2. 创建需要的组件</strong></p>
<pre class="hljs bash"><code class="bash">ng g component home
ng g component news
ng g component newscontent
</code></pre>
<p><strong>3. 找到 app-routing.module.ts 配置路由</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// 引入组件
<span class="hljs-keyword">import { HomeComponent } <span class="hljs-keyword">from <span class="hljs-string">'./home/home.component';
<span class="hljs-keyword">import { NewsComponent } <span class="hljs-keyword">from <span class="hljs-string">'./news/news.component';
<span class="hljs-keyword">import { NewscontentComponent } <span class="hljs-keyword">from <span class="hljs-string">'./newscontent/newscontent.component';
<span class="hljs-comment">// 配置路由
<span class="hljs-keyword">const routes: Routes = [
{<span class="hljs-attr">path: <span class="hljs-string">'home', <span class="hljs-attr">component: HomeComponent},
{<span class="hljs-attr">path: <span class="hljs-string">'news', <span class="hljs-attr">component: NewsComponent},
{<span class="hljs-attr">path: <span class="hljs-string">'newscontent/:id', <span class="hljs-attr">component: NewscontentComponent},
{
<span class="hljs-attr">path: <span class="hljs-string">'',
<span class="hljs-attr">redirectTo: <span class="hljs-string">'/home',
<span class="hljs-attr">pathMatch: <span class="hljs-string">'full'
} ];
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>4. 找到 app.component.html 根组件模板,配置 router-outlet 显示动态加载的路由</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h1>
<span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/home">首页<span class="hljs-tag"></<span class="hljs-name">a> <span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/news">新闻<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"></<span class="hljs-name">h1>
<span class="hljs-tag"><<span class="hljs-name">router-outlet><span class="hljs-tag"></<span class="hljs-name">router-outlet>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>10.2 routerLink 跳转页面 默认路由</h2>
<pre class="hljs xml"><code class="xml"> <span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/home">首页<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/news">新闻<span class="hljs-tag"></<span class="hljs-name">a>
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java"><span class="hljs-comment">//匹配不到路由的时候加载的组件 或者跳转的路由
{
path: <span class="hljs-string">'**', <span class="hljs-comment">/*任意的路由*/
<span class="hljs-comment">// component:HomeComponent
redirectTo:<span class="hljs-string">'home'
}
</span></span></span></span></span></code></pre>
<h2>10.3 routerLinkActive 设置routerLink 默认选中路由</h2>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h1>
<span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/home" <span class="hljs-attr">routerLinkActive=<span class="hljs-string">"active">首页<span class="hljs-tag"></<span class="hljs-name">a> <span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/news" <span class="hljs-attr">routerLinkActive=<span class="hljs-string">"active">新闻<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"></<span class="hljs-name">h1>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">h1>
<span class="hljs-tag"><<span class="hljs-name">a [<span class="hljs-attr">routerLink]=<span class="hljs-string">"[ '/home' ]" <span class="hljs-attr">routerLinkActive=<span class="hljs-string">"active">首页<span class="hljs-tag"></<span class="hljs-name">a> <span class="hljs-tag"><<span class="hljs-name">a [<span class="hljs-attr">routerLink]=<span class="hljs-string">"[ '/news' ]" <span class="hljs-attr">routerLinkActive=<span class="hljs-string">"active">新闻<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"></<span class="hljs-name">h1>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs css"><code class="css"> <span class="hljs-selector-class">.active{
<span class="hljs-attribute">color:red;
}
</span></span></code></pre>
<h2>10.4 routerLink Get传递参数</h2>
<p><strong>1. 跳转</strong></p>
<pre class="hljs javascript"><code class="javascript"><li *ngFor=<span class="hljs-string">"let item of list;let key=index;">
<span class="xml"><span class="hljs-comment"><!-- <a href="/news-detail?aid=123">{{key}}--{{item}}</a> -->
<span class="hljs-tag"><<span class="hljs-name">a [<span class="hljs-attr">routerLink]=<span class="hljs-string">"['/news-detail']" [<span class="hljs-attr">queryParams]=<span class="hljs-string">"{aid:key}">{{key}}--{{item}}<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"></<span class="hljs-name">li>
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>2. 接收参数</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">import { ActivatedRoute } <span class="hljs-keyword">from <span class="hljs-string">'@angular/router';
<span class="hljs-keyword">constructor(public route:ActivatedRoute) { }
<span class="hljs-keyword">this.route.queryParams.subscribe(<span class="hljs-function">(<span class="hljs-params">data)=>{
<span class="hljs-built_in">console.log(data);
})
</span></span></span></span></span></span></span></span></code></pre>
<h2>10.5 动态路由</h2>
<p><strong>1.配置动态路由</strong></p>
<pre class="hljs java"><code class="java"><span class="hljs-keyword">const routes: Routes = [
{path: <span class="hljs-string">'home', component: HomeComponent},
{path: <span class="hljs-string">'news', component: NewsComponent},
{path: <span class="hljs-string">'newscontent/:id', component: NewscontentComponent},
{
path: <span class="hljs-string">'',
redirectTo: <span class="hljs-string">'/home',
pathMatch: <span class="hljs-string">'full'
} ];
</span></span></span></span></span></span></span></code></pre>
<p><strong>2. 跳转传值</strong></p>
<pre class="hljs xml"><code class="xml"><span class="hljs-tag"><<span class="hljs-name">a [<span class="hljs-attr">routerLink]=<span class="hljs-string">"[ '/newscontent/',aid]">跳转到详情<span class="hljs-tag"></<span class="hljs-name">a>
<span class="hljs-tag"><<span class="hljs-name">a <span class="hljs-attr">routerLink=<span class="hljs-string">"/newscontent/{{aid}}">跳转到详情<span class="hljs-tag"></<span class="hljs-name">a>
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>3. 获取动态路由的值</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { ActivatedRoute} <span class="hljs-keyword">from <span class="hljs-string">'@angular/router';
<span class="hljs-keyword">constructor( private route: ActivatedRoute) { }
ngOnInit() {
<span class="hljs-built_in">console.log(<span class="hljs-keyword">this.route.params);
<span class="hljs-keyword">this.route.params.subscribe(<span class="hljs-function"><span class="hljs-params">data=><span class="hljs-keyword">this.id=data.id);
}
</span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>10.6 动态路由的 js 跳转</h2>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-comment">// 引入
<span class="hljs-keyword">import { Router } <span class="hljs-keyword">from <span class="hljs-string">'@angular/router';
<span class="hljs-comment">// 初始化
<span class="hljs-keyword">export <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">HomeComponent <span class="hljs-title">implements <span class="hljs-title">OnInit {
<span class="hljs-keyword">constructor(private router: Router) {}
ngOnInit() {}
goNews(){
<span class="hljs-comment">// this.router.navigate(['/news', hero.id]);
<span class="hljs-keyword">this.router.navigate([<span class="hljs-string">'/news']);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="hljs java"><code class="java"><span class="hljs-comment">// 路由跳转
<span class="hljs-keyword">this.router.navigate([<span class="hljs-string">'/news', hero.id]);
</span></span></span></code></pre>
<h2>10.7 路由 get 传值 js 跳转</h2>
<p><strong>1. 引入 NavigationExtras</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { Router ,NavigationExtras} <span class="hljs-keyword">from <span class="hljs-string">'@angular/router';
</span></span></span></code></pre>
<p><strong>2. 定义一个 goNewsContent 方法执行跳转,用 NavigationExtras 配置传参。</strong></p>
<pre class="hljs javascript"><code class="javascript">goNewsContent() {
<span class="hljs-keyword">let navigationExtras: NavigationExtras = {
<span class="hljs-attr">queryParams: {
<span class="hljs-string">'session_id': <span class="hljs-string">'123'
},
<span class="hljs-attr">fragment: <span class="hljs-string">'anchor'
};
<span class="hljs-keyword">this.router.navigate([<span class="hljs-string">'/news'], navigationExtras);
}
</span></span></span></span></span></span></span></span></code></pre>
<p><strong>3. 获取 get 传值</strong></p>
<pre class="hljs javascript"><code class="javascript"> <span class="hljs-keyword">constructor(private route: ActivatedRoute) {
<span class="hljs-built_in">console.log(<span class="hljs-keyword">this.route.queryParams);
}
</span></span></span></code></pre>
<h2>10.8 父子路由</h2>
<p><strong>1. 创建组件引入组件</strong></p>
<pre class="hljs javascript"><code class="javascript"><span class="hljs-keyword">import { NewsaddComponent } <span class="hljs-keyword">from <span class="hljs-string">'./components/newsadd/newsadd.component';
<span class="hljs-keyword">import { NewslistComponent } <span class="hljs-keyword">from <span class="hljs-string">'./components/newslist/newslist.component';
</span></span></span></span></span></span></code></pre>
<p><strong>2. 配置路由</strong></p>
<pre class="hljs css"><code class="css">{
<span class="hljs-attribute">path: <span class="hljs-string">'news',
component: NewsComponent,
children: [{
path: <span class="hljs-string">'newslist',
component: NewslistComponent
},
{
<span class="hljs-attribute">path: <span class="hljs-string">'newsadd',
component: NewsaddComponent
}]
}
</span></span></span></span></span></code></pre>
<p><strong>3. 父组件中定义 router-outlet</strong></p>
<pre class="hljs xml"><code class="xml"> <span class="hljs-tag"><<span class="hljs-name">router-outlet><span class="hljs-tag"></<span class="hljs-name">router-outlet>
</span></span></span></span></code></pre>
<h1>十一、更多参考</h1>
<ul>
<li>Angular中文文档</li>
</ul>
</div>
<p><br><br><br></p><br><br>
来源:https://www.cnblogs.com/mary-123/p/11225260.html
頁:
[1]