逐日醉舟 發表於 2020-7-22 23:34:00

Angular

<table style="height: 637px; width: 1062px" border="0">
<tbody>
<tr>
<td>
<p>https://cloud.tencent.com/developer/devdocs</p>
<p>&nbsp;</p>
<p>1.设计原则<br>(1)YAGNI<br>You Aren't Gonna Need It,你不会需要它;不写不需要的功能</p>
<p>(2)KISS<br>Keep It Simple and Stupid,让你的代码越简单/傻瓜越好<br>(3)OCP<br>Open Close Principle,开闭原则,对外界修改封闭(不允许修改已有代码),对外界的扩展开放</p>
<p>(4)High Cohesion, Low Coupling</p>
<p>高聚合,低耦合;功能相关代码紧密在一起;功能不相干代码拆分越明确越好</p>
<p>(5)迪米特法则/最少知识原则<br>一个对象/组件,数据/操作越少越好</p>











</td>











</tr>
<tr>
<td>&nbsp;Angular
<p>Angular由Google在2009年创建的MVVM框架,适用于中大型的企业级SPA应用。</p>
<p>V1.x官网: https://angularjs.org/<br>Angularjs用JS编写<br>V2.x~8.x官网: https://angular.io/ Angular 用TS编写<br>V2.x~8.x中文网: https://angular.cn/<br>提示: V1到V2的升级变化非常大!<br>注意: Angular 8.x要求Node.js版本必须是10.9以上!</p>
<p>&nbsp;</p>
<p>3.创建第一个 Angular项目<br>①安装Node.js和NPM<br>Node.js版本必须&gt;=10.9<br>②安装全局的Angular脚手架工具<br>npm i&nbsp;&nbsp;-g&nbsp;&nbsp;@angular/cli</p>
<p>&nbsp;</p>
<table border="0">
<tbody>
<tr>
<td>
<p>提示:如果使用NPM从官方网站下载NPM包总是失败,可以把默<br>认下载地址改为国内淘宝网镜像:<br>查看当前下载地址:<br>npm config get registry<br>默认值为: https://registry.npmjs.org/</p>
<p>修改为淘宝网NPM镜像:<br>npm&nbsp;&nbsp;config&nbsp;&nbsp;set&nbsp;&nbsp;registry= https://registry.npm.taobao.org/</p>












</td>












</tr>












</tbody>












</table>
<p>&nbsp;</p>
<p>默认会在C:\Users\web\AppData\Roaming\npm目录下安装ng.cmd可执行文件及其相关文件<br>③运行全局脚手架,创建一个 Angular空白项目</p>
<p><span class="pln">  ng new my<span class="pun">ng<span class="pln">app01</span></span></span></p>
<p>此步需要联网从NPM官网下载第三方模块</p>
<p>Would you like to add Angular routing? y</p>
<p>Which stylesheet format would you like to use? (Use arrow keys)<br>&gt; CSS<br>SCSS [ https://sass-lang.com/documentation/syntax#scss ]<br>Sass [ https://sass-lang.com/documentation/syntax#the-indented-syntax ]<br>Less [ http://lesscss.org ]<br>Stylus [ http://stylus-lang.com ]</p>
<p>④进入项目根目录,运行该项目(Node.js 项目)<br>npm&nbsp;&nbsp;start&nbsp;或者&nbsp;ng&nbsp;&nbsp;serve</p>
<table style="height: 159px; width: 584px" border="0">
<tbody>
<tr>
<td>
<p style="text-align: left">Vue,js项目的主配置文件:&nbsp; &nbsp; vue.config.js<br>Angular项目的主配置文件:&nbsp; angular.json</p>











</td>











</tr>
<tr>
<td>
<p>ES6中有"模块”的概念: export/export default、import.from..<br>Vue.js中无自己的"模块”概念一项目是由自定 义组件构成; <br>Angular中有自己的"模块”概念一项目是由自定义组件构成, 每个组件都要放在一个特定的module中,</p>
<p><img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200722143331103-235050832.png"></p>











</td>











</tr>











</tbody>











</table>
<p>4.Angular项目引导启动流程<br>①系统运行main.ts<br>②main.ts启动主模块AppModule<br>③在主模块中引导启动主组件AppComponent</p>
<p>④主组件中声明了模板和样式,最终渲染在index.html中&lt;app-root/&gt;</p>
<p>&nbsp;</p>











</td>











</tr>
<tr>
<td>
<p>(2)Angular核心概念之一 一一组件<br>可以复用的页面片段,<br>Component = Script + Template + Style.<br>Angular中的组件是多文件组件: .ts + .html + .css/.scss<br>注意:组件必须在某个模块(AppModule)中声明!</p>
<p>&nbsp;</p>
<p>&nbsp;使用快捷命令创建:<br>ng&nbsp;g&nbsp;&nbsp;component&nbsp;&nbsp;组件名</p>
<p>(3)Angular核心概念之二———数据绑定<br>①innerHTML绑定: {{ }}<br>②属性绑定: [ attr ] =""&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(区分vue&nbsp; v-bind&nbsp; / :)</p>
<p>③事件绑定: ( click)= "fn( )"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(区分vue&nbsp; &nbsp;v-on /@)<br>④循环绑定: *ngFor&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (区分vue&nbsp; &nbsp;v-for)<br>⑤选择绑定: *nglf&nbsp; (提示: *nglf 会影响DOM结构)</p>
<p>⑥选择绑定: *ingSwitchCase&nbsp;&nbsp;*ngSwitchDefault<br>⑦样式绑定: &nbsp; &nbsp;</p>
<p>⑧样式绑定指令: <br>⑨双向数据绑定指令:</p>
<table style="height: 32px; width: 429px" border="0">
<tbody>
<tr>
<td>
<p>Angular中指令分为哪几类:</p>
<p>(1)组件指令<br>&lt;myc01&gt; &lt;/myc01&gt;<br>Component extends Directive, 组件继承自指令,组件是有模板的指令<br>(2)结构型指令<br>可以影响当前的DOM结构的指令;所有结构型指令都以*开头<br>(3)属性型指令</p>
<p>不会影响DOM结构,只会影响当前元素的特征,如样式;所有的属性型指令都用[]括起来!</p>











</td>











</tr>











</tbody>











</table>
<p>&nbsp;</p>
<p>1.Angular核心概念之三一指令(Directive)<br>指令:是一种特殊的模板页面内容,可以对页面执行特殊的处理;<br>例如:&lt; any*ngFor=""&gt;<br>Angular中常见指令:<br>①循环绑定指令: *ngFor<br>&lt;any *ngFor="let tmp of 集合对象"&gt;</p>
<p><br>②选择绑定指令: *ngIf<br>&lt;any *nglf= " expression" &gt;<br>提示: *nglf 会影响DOM结构</p>
<p><br>③选择绑定指令: *ngSwitchCase *ngSwitchDefault<br>&lt;any = "变量名"&gt;<br>&lt;any *ngSwitchCase= "值"&gt; ... &lt;/any&gt;</p>
<p>...</p>
<p>&lt; any"ngSwitchDefault&gt; ... &lt;/any&gt;</p>
<p>&lt;/any&gt;</p>
<p>④样式绑定指令: <br>&lt;any = "obj"&gt;</p>
<p>⑤样式绑定指令: <br>&lt;any ="obj"&gt;</p>
<p>&nbsp;</p>
<p>2.(了解)如何自定义指令<br>可使用工具<span style="color: rgba(255, 0, 0, 1)">ng&nbsp; g&nbsp; directive 指令名</span>&nbsp; &nbsp; &nbsp; 快速的创建一个指令</p>
<p>&lt; div&nbsp; appNeedStrong&gt; ... &lt;/div&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>@Directive({ selector: 'appNeedStrong' })<br>export class MyDirective {<br>contructor( el: ElementRef){<br>el.nativeElemet.xxx.....<br>  }<br>}</p>
<p><img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200722180542185-1016480117.png"></p>
<p>3.Angular中的双向数据绑定<br>方向1: Model=&gt;View<br>方向2: View=&gt;Model<br>Angular中实现双向数据绑定的方法:<br>&lt;input&nbsp; &nbsp;<span style="color: rgba(255, 0, 0, 1)">[(ngModel)]</span>="userName"&gt;</p>
<p>&nbsp;</p>
<p>提示: ngModel指令处于FormsModule,必须在当前模块中声明导<br>入才能使用:</p>
<p>import { FormsModule } from '@angular/forms';<br>@NgModule({<br><span style="color: rgba(255, 0, 0, 1)">imports: [ FormsModule ]</span><br>})</p>
<p>如果想监视模型数据的改变(就像Vue.js 中的watch函数),可以使用<br>ngModelChange事件:</p>
<p>&lt;input&nbsp; [(ngModel)]= "userName"&nbsp; (ngModelChange)="fn()"&gt;</p>
<p>&nbsp;</p>
<p>示例:创建密码输入框,随着用户的输入,后面的提示信息不停的在改变:</p>
<p>"密码不能为空"<br>"密码长度不能少于6位"<br>"密码长度合法"<br>"密码长度不能超过12位"</p>
<p>&nbsp;</p>
<p>使用Angular实现TodoList</p>
<p><img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200722212523565-1225219450.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4.Angular核心概念之四---管道<br>Vue.js中的过滤器(filter): &lt;p&gt;{{1| sex('zh'}}&lt;/p&gt;<br>Angular中的类似的概念称为管道(pipe): &lt;p&gt;{{1 |sex:zh' }}&lt;/p&gt;<br>Vue.js没有内置任何过滤器;但Angular内置了很多好用的管道:<br>①lowercase:把数据转换为小写形式</p>
<p>②uppercase:把数据转换为大写形式<br>③slice:获取字符串或数组中的一部分<br>④json:把对象转换为JSON字符串<br>⑤date:把日期/数字转换为特定格式的日期字符串<br>⑥number:数字格式化(每E位加逗号,并指定小数位数)<br>⑦currency:把数字以货币形式显示</p>
<table style="height: 258px; width: 459px" border="0">
<tbody>
<tr>
<td>TypeScript语法知识:</td>










</tr>
<tr>
<td>
<p>(1)class中的成员(属性、方法)、参数的参数都可以声明类型:<br>  class Book{<br>  price: number = 12.5<br>  add(n:number): void{ }<br>    }</p>










</td>










</tr>
<tr>
<td>
<p>(2)TS中的新类型:接口(interface)<br>接口是一种特殊的class,用于规定一个对象“必须具备”哪些功能<br>interface Runnable{</p>
<p>    run( );<br>    stop( );<br>  }<br>class Car implements Runnable{<br>  run( ){...}<br>stop( ){...}<br>}</p>









</td>









</tr>










</tbody>










</table>
<p>&nbsp;</p>











</td>











</tr>
<tr>
<td>&nbsp;
<p>1.自定义管道:</p>
<p style="margin-left: 30px"><br>工具命令:<br>ng&nbsp; g&nbsp; pipe<br>管道名<br>@Pipe({<br>name: 'sex'<br>})<br>class SexPipe {<br>transform(val, args){<br>return ...;<br>}<br>}</p>
<p>示例:创建一个管道: zzmm,可以把数字1/2/3分别转换为"党员/中共党员”、”团员/中国共青团团员”和"群众/中国人民群众”</p>









</td>











</tr>
<tr>
<td>
<p>2.(重点/难点)父子组件间的数据传递<br>ng g&nbsp;&nbsp;component&nbsp; parent<br>ng g&nbsp; component&nbsp; &nbsp;child<br>&nbsp;</p>
<p>(1)父组件给子组件传递数据:父=&gt;子-Props Down</p>
<p style="margin-left: 30px">(1.1)子组件声明自己专有的属性</p>
<p style="margin-left: 30px">@Input()&nbsp; &nbsp; &nbsp;//Input装饰器把下面的属性变为“输入型属性”<br>userName: string;<br>(1.2)父组件使用子组件的专有属性赋值一值为父组件的模型数据<br>&lt;app-child ="myName"&gt;</p>
<p>-----------------------------------------------------------------------</p>
<p>parent.component.html:</p>
<p>&lt;h1&gt;这里是父组件&lt;/h1&gt;<br>&lt;app-child =" parentName' &gt; &lt;/app-child&gt;</p>
<p><br>parent.component.ts:</p>
<p>parentName: '父亲的名称'</p>
<p>&nbsp;</p>
<p>child.component.ts:<br>@Input( )<br>private uname: string</p>
<p>-----------------------------------------------------------------------</p>
<p><br>(2)子组件给父组件传递数据:子=&gt;父 一Events Up</p>
<p style="margin-left: 30px">(2.1)子组件声明并触发事件,触发时携带自己的数据</p>
<p>@Output()<br>unameEvent = new EventEmitter();<br>...<br>this.unameEvent.emit(data);</p>
<p style="margin-left: 30px"><br>(2.2)父组件监听子组件的事件,并提供处理函数接收事件数据</p>
<p>&lt; app-child (unameEvent)= "doEvent(<span style="color: rgba(255, 0, 0, 1)"><strong>$event)</strong></span>" &gt;<br>....<br>doEvent( data ){...}</p>
<p>---------------------------------------------------------------------</p>
<p>parent.component.html:<br>&lt;h1&gt;这里是父组件&lt;/h1&gt;<br>&lt;app-child (childEvent)= "doChildEvent($event)"&gt; &lt;/app-child&gt;<br>parent.component.ts:<br>doChildEvent( data){ .. }</p>
<p>&nbsp;</p>
<p>child.component.ts:<br>private childName: string = '孩子的名称'<br>@(Ouput)<br>private childEvent = new EventEmitter()<br>doClick(){<br>this.childEvent.emit( this.childName )<br>}</p>









</td>











</tr>
<tr>
<td>&nbsp;
<p>3.服务和依赖注入<br>Angular认为:<br>Component:组件,仅应该只负责视图,只参与展示;与展示无关的语句都应该剥离出去;例如:做日志、计时、网络数据访问<br>Service:服务,就是一个简单的对象,负责执行从组件中剥离的与视图无关的操作,例如:做日志、计时、网络访...<br>创建服务:<br>ng&nbsp; generate&nbsp; service&nbsp; 服务名</p>







</td>











</tr>
<tr>
<td>
<p>inject:打针,注入<br>injectable:能被注入给别人的</p>
<p>&nbsp;</p>
<p>Angular创建对象的两种方式:<br>(1)手工创建<br>var logger = new LoggerService();<br>logger.log("用户增加了一个商品);</p>
<p>(2)依赖注入(Dependency Injection)<br><span style="color: rgba(255, 0, 0, 1)">logger</span> = null;<br>constructor(<span style="color: rgba(153, 204, 0, 1)">logger</span>:LoggerService){<br><span style="color: rgba(255, 0, 0, 1)">this.logger</span> = <span style="color: rgba(153, 204, 0, 1)">logger</span><br>}</p>
<p>在构造方法中声明需要依赖某个对象,且该对象是”可以被注入的<br>(@Injectable)" ,那么Angular就会自动创建依赖的对象,并注入给<br>当前构造方法</p>







</td>











</tr>
<tr>
<td>&nbsp;TypeScript知识点一 强类型语言:
<p>1.类型声明:<br>class Book{<br>price: <span style="color: rgba(255, 0, 0, 1)">number</span> = 1.5<br>author: <span style="color: rgba(255, 0, 0, 1)">any</span> = 'Tom'<br>}</p>
<p>work( tool: number[] ): void{<br>}</p>
<p>&nbsp;</p>
<p>2.接口:是一种特殊的class,用于规定一个class必须提供特定的方法<br>interface Runnable{<br>run()<br>stop()<br>}<br>class Car implements Runnable{</p>
<p>run(){}</p>
<p>stop(){}</p>
<p>}</p>
<p>&nbsp;</p>
<p>3.类成员(属性/方法)的访问修饰符</p>
<p>①private: 私有成员,只能在当前类内部使用; class中的属性一般都应该声明为私有的或被保护的!<br>②protected:被保护的,只能在当前类内部以及子类中使用<br>③public:默认值!公共成员,可以被任何类使用;&nbsp;class中的方法一般声明为公共的!</p>
<p><img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200725103802576-2042208771.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4.类属性的声明/赋值方式<br>class Book{<br><span style="color: rgba(255, 0, 0, 1)">private</span> <span style="color: rgba(153, 204, 0, 1)">price</span>:number =0</p>
<p>public constructor( <span style="color: rgba(255, 0, 255, 1)">price</span>: number ){<br><span style="color: rgba(153, 204, 0, 1)">this.price</span> = <span style="color: rgba(255, 0, 255, 1)">price</span><br>}<br>}</p>
<p>&nbsp;</p>
<p>上面的代码可以简写为:<br>class Book{<br>//构造方法中的形参前加<span style="color: rgba(255, 0, 0, 1)">private/ protected/public</span>此形参<br>自动变为一个同名属性,且自动赋值<br>public constructor( <span style="color: rgba(255, 0, 0, 1)">private</span> price: number ){<br>    }<br>  }<br>var book1 = new Book( 100 )</p>






</td>











</tr>
<tr>
<td>&nbsp;
<p>1.Angular核心概念之六————服务和DI(依赖注入)</p>
<p>Component:负责视图的数据绑定/事件处理<br>Service:负责从组件中剥离的与视图无关的任务,如日志计时、网络访问...</p>
<p>注意: Angular 中的依赖注入是基于构造方法的参数类型,而与先后顺序无关</p>
<p>创建服务:<br>@lnjectable( {<br>//可以被注入给某个组件<br>//Injector/Provider:注入器/服务提供者,负责创建服务对象<br>并注入给组件, Angular 会自动为每个服务创建必需的注入器<br>})<br>export class LoggerService{</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>问题: Angular 中的Service可以在哪里被提供/Service的提供者/注入器有哪些?<br>方式1:声明服务时提供——根模块中提供的服务对象是整个应用中 “ 单例的"(logger.service.ts中)<br>@lnjectable({&nbsp;<br>  <span style="color: rgba(255, 0, 0, 1)">providedIn: 'root'</span><br>})<br>export class LoagerService{ }</p>
<p>万式2:在模块中提供----在当期模块中的所有组件共用同一 个服务对象(app module.ts中)</p>
<p>@Injectable()<br>@NgModule({<br>providers: [ <span style="color: rgba(255, 0, 0, 1)">LoggerService</span> ]&nbsp;<br>})</p>
<p>方式3:在组件声明中提供----该服务仅能作用于当前组件(组件的ts文件中)<br>@Component({<br>selector: 'app-myc01',<br>template:'',<br>providers: [<span style="color: rgba(255, 0, 0, 1)"> LoggerService</span> ]<br>})&nbsp;</p>






</td>











</tr>
<tr>
<td>&nbsp;
<p>问题:前端技术中有哪些异步请求方案?<br>(1)原生XHR:<br>(2)jQuery封装: $.ajax( )&nbsp; &nbsp; 基于回调函数= &gt;回调地狱<br>(3)Axios:底层还是XHR,基于Promise,可以避免回调地狱<br>(4)Angular HttpClient服务:底层还是XHR 基于Observable<br>(5)ES2016新方案: Fetch: 底层不是XHR!就是fetch对象!&nbsp; &nbsp;不支持请求打断、请求排队</p>
<p>由W3C提供的XHR的替代方案,采用Promise</p>






</td>











</tr>
<tr>
<td>&nbsp;
<p>2.Angular中异步请求服务器端数据<br>HTTPClient Service:是Angular官方提供的异步请求工具<br>使用步骤:<br>(1)在主模块中引入HTTPClientModule-会提供 HttpClient服务的注入器<br>@NgModule({</p>
<p>imports: [ HttpClientModule ]<br>})<br>(2)在需要使用异步请求模块中声明依赖HttpClient服务<br>constructor(private http: HttpClient){}</p>
<p>(3)调用HttpClient提供的异步数据请求服务<br>this.http.get( )<br>this.http.post( )<br>this.http.put( )<br>this.http.delete( )</p>






</td>











</tr>
<tr>
<td>
<p>3. Rx.js和Observable对象<br>Angular中HttpClient服务底层基于Rx.js 第三方模块<br>官方: RxJS是Reactive Extensions for JavaScript 的缩写,是一<br>个基于可观测数据流在异步编程应用库。RxJS是Reactive<br>Extensions在JavaScript.上的实现。-般说到RxJS,都会讲他是基<br>于流的响应式的结合观察者和迭代器模式的一种库<br>Observer模式(也称为“订阅-发布”模式):</p>
<p>乙方声明“订阅(subscribe)" 甲方;<br>在未来的某个不确定时间,甲方"发布(publish)" 新消息,乙方会立即接到通知</p>
<p>HttpClient服务采用了“观察者/订阅-发布模式" ,其最核心对象为:&nbsp;<br>let obj=new Observable( ); //可被观察的对象<br>//可以关注/订阅“可被观察的”对象<br>pbj.subscribe( ( )=&gt;{ //收到订阅消息时的回调函数} )</p>






</td>











</tr>
<tr>
<td>&nbsp;示例:创建组件: ProductList,点击“加载更多”则异步请求更多数据,呈现在表格中,</td>











</tr>
<tr>
<td>&nbsp;4.Angular中组件的声明周期钩子函数
<p>Hooks Function:声明好的特定的函数,到了指定的时间点,就会被自动执行<br>LifeCycle Hooks Function:在组件的不同生命阶段会自动执行的函数</p>
<p>面试题: Angular中组件的生命周期钩子函数按顺序有:<br><span style="color: rgba(255, 0, 0, 1)">(0)constructor( ):</span>构造方法执行且仅执行一次<br><span style="color: rgba(255, 0, 0, 1)">(1)ngOnChanges( ):</span>组件的输入属性值发生赋值或改变<br><span style="color: rgba(255, 0, 0, 1)">(2)</span><strong><span style="color: rgba(255, 0, 0, 1)">ngOnInit():</span>组件正在初始化,执行且仅执行一次</strong></p>
<p><span style="color: rgba(255, 0, 0, 1)">(3)ngDoCheck( )</span>:组件正在执行变化检查</p>
<p style="margin-left: 30px">(4)ngAfterContentlnit( ):组件内容初始化之后<br>(5)ngAfterContentChecked():组件内容被重新检查后<br>(6)ngAfterViewInit( ):组件视图初始化之后<br>(7)ngAfterViewChecked):组件视图被重新检查后</p>
<p><span style="color: rgba(255, 0, 0, 1)">(8)ngOnDestroy( ):</span>组件即将从DOM树上销毁,用于释放定时器、取消订阅...执行且仅执行一次&nbsp;</p>






</td>











</tr>
<tr>
<td>&nbsp;
<p>5.Angular核心概念之七一路由和 SPA应用<br>Single Page Application,单页应用----整个应用中只有一个完整的HTML页面,其它所有的“页面”</p>
<p>SPA应用的优点:<br>(1)DOM树只需要创建一次,"页面切换”只是在切换部分元素<br>(2)便于实现“过场动画”一多页应用不可能做到<br>SPA应用的不足:</p>
<p>(1)不便于实现SEO优化</p>
<p>SPA应用的核心----路由词典(把一个地址和一个组件一 一对应起来):</p>
<p>[<br>{ path: 'index',component: ...<br>{ path: 'produlct/list',component: ...<br>{ path: 'user/login', component: ...<br>]<br>SPA应用的原理:框架根据客户端请求的路由地址,异步加载对应的组件内容,替换之前的组件内容</p>
<p><br>使用Angular中的路由步骤:<br>(0)提前准备好路由组件</p>
<p>ng g component index</p>
<p>ng g component productList</p>
<p>ng g component productDetail</p>
<p><br>(</p>
<p>(1)在根模块中创建路由词典<br>var&nbsp;&nbsp;routes = [ {path:", component: ... }]<br>(2)在根模块引入路由模块,注册路由词典<br>@NgModule({<br>import: [ RouterModule.forRoot(routes) ]<br>})</p>
<p>(3)在根模块的模板中声明路由组件的占位符</p>
<p>&lt;router-outlet&gt;&lt;/router-outlet&gt;</p>
<p>(4)让客户端请求路由地址</p>
<p>http://127.0.0.1:4200/product/list</p>






</td>











</tr>
<tr>
<td>
<p>&nbsp;示例:</p>
<p style="margin-left: 30px">1)创建如下四个组件: ng g component index</p>
<p style="margin-left: 30px">        &nbsp; ng g component productList</p>
<p style="margin-left: 30px">&nbsp;         ng g component productDetail</p>
<p style="margin-left: 150px">ng g component userCenter</p>
<p style="margin-left: 30px"><br>2)创建路由词典,为每个组件分配访问路径</p>
<p style="margin-left: 150px"><br>index    =&gt;&nbsp; &nbsp; &nbsp; &nbsp; index<br>productList&nbsp;&nbsp;&nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; product/list</p>
<p style="margin-left: 150px">productDetail =&gt;  product/detail<br>userCenter&nbsp; &nbsp; &nbsp;=&gt;  user/center</p>
<p style="margin-left: 150px">let routes=[{path:'',component:...},...]</p>
<p style="margin-left: 30px">3)在根模块中注册路由词典</p>
<p style="margin-left: 30px">RouterModule.forRoot(routes);<br>4)在根组件中声明路由出口</p>
<p style="margin-left: 30px">app.component.html:&nbsp; &lt;router-outlet&gt;&lt;/router-outlet&gt;<br>5)使用客户端访问每个路由地址,测试路由功能实现</p>
<p style="margin-left: 30px">http://127.0.0.1:4200/user/center</p>
<p style="margin-left: 30px">&nbsp;</p>
<p style="margin-left: 30px">&nbsp;</p>
<p style="margin-left: 30px">1.路由词典的配置</p>
<div>
<div>let&nbsp;routes=[</div>
<div>&nbsp;&nbsp;{path:'',component:IndexComponent},</div>
<div>&nbsp;&nbsp;{path:'index',component:IndexComponent},</div>
<div>&nbsp;&nbsp;{path:'product/list',component:ProductListComponent},</div>
<div>&nbsp;&nbsp;{path:'product/detail',component:ProductDetailComponent},</div>
<div>&nbsp;&nbsp;{path:'user/center',component:UserCenterComponent},</div>
<div>&nbsp;&nbsp;{path:'**',component:NotFoundComponent}</div>
<div>
<p>注意:路由词典中的路由path不能以'/' 开头,但是,路由跳转时指定的路径最好都以‘/’开头<br><br>2.路由跳转<br>从一个路由地址跳转到另一个有两种方法:<br>方式1:编程方式</p>
<p><span style="color: rgba(255, 0, 0, 1)">constructor(private <span style="color: rgba(153, 204, 0, 1)">router</span>:Router){}</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">...</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">this.router.navgeteByUrl('<span style="color: rgba(153, 204, 0, 1)">r</span><span style="color: rgba(153, 204, 0, 1)">outer</span>')</span><br>方式2:模板方式</p>





</div>
<div>&lt;any routerLink="..."&gt;</div>
<div>注意:routerLink指令可以用在任何元素上,如DIV、A、BUTTON</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>
<p>3.路由参数<br>在路由的path属性中,有些部分固定不变,有些部分需要动态变化:<br>{ path: product/detail/20', component: .. }<br>{ path: product/detail/23', component: .. }<br>{ path: product/detail/35', component: .. }</p>
<p>--------------------------------------------------------------------</p>
<p>{ path: product/detail/<span style="color: rgba(153, 204, 0, 1)">:pid</span>', component: ... }<br>路由参数:路由地址中的变量<br>使用步骤:<br>①路由词典中设置路由参数:&nbsp;<br>path: 'product/detail/<span style="color: rgba(153, 204, 0, 1)">:pid</span>',<br>②路由跳转时提供路由参数值:<br>&lt;any routerLink= " /product/detail/<span style="color: rgba(153, 204, 0, 1)">35</span>"&gt;</p>
<p>③在目标组件中读取当前路由的参数<br>constructor( private route: ActivatedRoute ){<br>}<br>ngOnInit(){<br>this.route.params.subscribe( (data)=&gt;{<br>  data.pid<br>  })<br>}<br><br></p>
<p>&nbsp;</p>
<p>&nbsp;</p>





</div>





</div>





</td>











</tr>
<tr>
<td>&nbsp;
<p>4.路由嵌套<br>在一个路由组件内部,有部分内容固定,另一区域中的内容可以切换不同的子组件一嵌套路由<br>路由词典:</p>
<p>let<br>routes = [<br>{<br>path: 'user/center',<br>component: UserCenterComponent,<br>children: [</p>
<p>{ path: 'myinfo', component: ....<br>{ path: 'headpic', component: ..<br>{ path: 'security', component: ...</p>
<p>   ]<br>  }<br>]</p>
<p>路由出口:<br>app.component.html: &lt; router-outlet&gt; &lt;/router-outlet&gt;<br>user-center.component.html:....&lt; router-outlet&gt; &lt;/router-outlet&gt;...</p>
<p>示例:为“用户中心”创建嵌套路由<br>(0)创建必需的子组件<br>ng g component myInfo<br>ng&nbsp;g component headPic<br>ng g component securityManagement</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5.路由守卫<br>Guard:护卫,守护者<br>有些路由地址只有在特定条件满足的情况下才允许访问,不满足的情况下禁止访问<br>如是否登录、是否充值、是否满足时间段限制...<br>对访问条件是否满足而进行设置,满足的话,就让访问路由组件;否则就不<br>让访问一这种对象成为 “路由守卫对象”</p>
<p>使用方法:<br>①创建一个路由守卫:<br>@lnjectable({<br>providedIn: 'root'<br>})<br>class Xxx {<br>canActivate(){ //组件是否允许被激活</p>
<p>.......<br>return true / false ;<br>  }<br>}</p>
<p>}</p>
<p>②使用路由守卫</p>
<p>[<br>{<br>path: 'user/center',<br>component: UserCenterComponent,<br>canActivate: [ XxxGuard ]<br>children: [ ...]<br>}<br>]</p>
<p>&nbsp;</p>
<p>创建一个路由守卫:&nbsp;<br>TimeCheckGuard,<br>作用:如果当前时间是18:00~ 24:00,允许用户访问user/center,否则禁止访问</p>




</td>











</tr>
<tr>
<td>
<p>移动端应用的种类:<br>(1)Native App:<br>原生App,指使用Java/Kotlin为Android. OC/Swift 为ios开发应用程序,直接运行与手机操作系统上<br>优势:运行速度快&nbsp; &nbsp;劣势:两套代码不跨平台,且必须下载</p>
<p>(2)Web App:<br>使用HTML/CSS/JS技术编写类似原生App的应用,代码运行于手机中的浏览器(如WebView)中,<br>优势:无需提前下载、一套代码到处运行&nbsp; &nbsp; &nbsp;劣势: 运行效率低、不能访问手机底层系统服务</p>
<p>&nbsp;</p>
<p>(3)Hybrid App:<br>使用HTML/CSS/JS技术编写类似原生App的应用,并混入部分Java/OC等驱动代码以调用系统底层服务,最终运行于操作系统中<br>优势:结合了前两种的优势</p>
<p>(4)Dart/ Flutter一 代表着未来</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;6.基于Angular的UI组件库</p>
<p>Angular相关的组件库:<br>(1)lonic<br>(2)Material<br>(3)Zorro<br>(4)Zorro Mobile</p>
<p>lonic概述:&nbsp;https://ionicframework.com/</p>
<p>lonic是一个基于HTML/CSS/JS技术的,创建混合App的UI组件库技术。底层可以不依赖于任何框架(弓|入.css和.js就可以运行),也可以<br>与Vue.js、React、 Angular 框架整合在一起,作为它们的第三方组件库使用。</p>
<p>&nbsp;</p>
<p>lonic CLI = Angular CLI + UIModule +移动端打包工具...<br><br></p>
<p>移动端打包工具</p>
<p>md: Meterial Design&nbsp; &nbsp; &nbsp;&nbsp;Android Studio<br>ios&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XCode<br>HBuilder:可以打包Android/iOs安装程序(国内)</p>
<p>&nbsp;</p>
<p>使用方法:<br><br>(1)下载全局脚手架工具<br>npm i&nbsp;&nbsp;-g&nbsp;ionic&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
<p>(npm config set registry https://registry.npm.taobao.org/)</p>
<p><br>(2)运行脚手架工具在当前目录下创建一个项目</p>
<p><br>ionic&nbsp;start&nbsp;项目名&nbsp;blank<br>ionic&nbsp;start&nbsp;项目名&nbsp;tabs<br>ionic&nbsp;start&nbsp;项目名&nbsp;sidemenu</p>
<p>创建好项目后会自动调用npm i 下载所依赖的第三方模块<br>(3)进入项目目录,运行它<br>  cd&nbsp; 项目名<br>  npm start</p>
<p>(4)启动客户端浏览器,访问开发服务器&nbsp; 用(手机)浏览器访问项目</p>
<p>http://127.0.0.1:4200</p>
<p>&nbsp;</p>
<p>lonic的九种主题色----color:<br>primary(蓝白)、secondary(青白)、tertiary(偏紫白)、danger(红白)、warn(黄白)、<br>success(绿白)、dark(黑白)、 medium(灰白). light(亮色)</p>
<p>&nbsp;</p>
<p>2.lonic App的页面布局<br>&lt;ion-app&gt;</p>
<p style="margin-left: 30px">ion-header &gt; ion-toolbar &gt; ion-title &gt;标题<br>ion-content &gt;内容<br>ion-footer &gt; ion-toolbar &gt; ion-title &gt;内容</p>
<p>&lt;/ion-app&gt;</p>
<p>------------------------------------------------------------</p>
<p>lonic主体中的“栅格布局系统”一仿 Bootstrap3:<br>&lt;ion-grid&gt;<br>&lt; ion-row&gt;<br>&lt;ion-col&nbsp; no-padding size="宽" offset="偏移" push="右推" pull="左拉"&gt; &lt;/ion-col&gt;<br>&lt;/ion-row&gt;<br>&lt;/ion-grid&gt;</p>
<p>&nbsp;</p>
<p>Module:模块<br>Model:模型,MVVM中第一个M<br>Modal:模态对话框</p>
<p>&nbsp;</p>
<p>3.lonic提供预定义组件<br>Icon:图标&lt;ion-icon name=""&gt;</p>
<p>Button:按钮&lt;ion-button&gt;<br>Badge:徽章&lt;ion-badge&gt;<br>Card:卡片ion-card&gt; ion-card-header + ion-card-content<br>Alert:警告框,必须使用AlertController创建并呈现&nbsp;&nbsp;</p>
<p>this.alertController.create({<br>}).then((d)= &gt;{d.present()})</p>
<p><br>Modal:模态框,必须使用ModalController创建并呈现</p>
<p>this.modalController.create({<br>}).then((d)= &gt;{d.present()})</p>
<p>Item:列表项</p>
<p>&lt;ion-item detail href= "#"&gt;<br>&lt;ion-avatar slot= "start"&gt; img &lt;/ion-avatar&gt;<br>&lt; ion-thumbnail&gt; img &lt;/ion-thumbnail&gt;<br>&lt;ion-label&gt; &lt;/ion-label&gt;<br>&lt; ion-button slot= "end"&gt;<br>&lt; /ion-item&gt;</p>
<p>&nbsp;</p>
<p>卡片:&lt; ion-card&gt; ion-card-header + ion-card-content&lt; /ion-card&gt;</p>
<p><br>List:列表</p>
<p>InfiniteScroll:无穷滚动组件,滚动到底部时加载更多内容</p>
<p>&lt;ion-infinite-scroll threshold = "20px" (ionInfinite)= "loadData" &gt;<br>&lt;ion-infinite-scroll-content<br>loadingSpinner=""<br>loadingText="&gt;<br>&lt;/ ion-infinite-scroll&gt;</p>
<p><br>Refresher:刷新器,从顶部显示加载更多内容</p>
<p>搜索条: &lt;ion-searchbar&gt;<br>滑动轮播: &lt;ion-slides&gt; &lt;ion-slide&gt; &lt;/ion-slide&gt; &lt;/ion-slides&gt;<br>标签页: &lt;ion-tabs&gt; &lt;/ion-tabs&gt;<br><br></p>
<p>2.Angular &amp; lonic阶段项目<br>实现步骤:<br>(1)创建空白的lonic项目模板<br>(2)创建项目必需的组件</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>ng g component&nbsp;main&nbsp; &nbsp;盛放ion-tabs组件的页面<br>ng g component&nbsp;index    首页(1F/2F/3F)<br>ng g component&nbsp;&nbsp;product-list  商品列表页<br>ng g component&nbsp;&nbsp;cart  购物车页<br>ng g component&nbsp;&nbsp;login  登录页</p>
<p>ng&nbsp;g&nbsp;component&nbsp;not-found&nbsp; &nbsp;&nbsp;404页<br>ng&nbsp;g&nbsp;component&nbsp;product-detail&nbsp;商品详情页</p>
<p>&nbsp;</p>
<p>确保每个组件都在AppModule中进行了声明: declarations:[ ]<br>(3)修改根组件模板AppComponent.html,使用</p>
<p>&lt;ion-app&gt;</p>
<p>&lt;ion-router-outlet&gt;&lt;/ion-router-outlet&gt;</p>
<p>  &lt;app-main&gt; &lt;/app-main&gt;</p>
<p>&nbsp;&lt;/ion-app&gt;</p>
<p>&nbsp;</p>
<p>(4)编辑main.component.html,声明页签组件<br>&lt;ion-tabs&gt;</p>
<p style="margin-left: 30px">&lt;ion-tab-bar&gt;</p>
<p style="margin-left: 60px">&lt;ion-tab-button&gt;图标+文字&lt;/ion-tab-button&gt;</p>
<p style="margin-left: 30px">&lt;/ion-tab-bar&gt;</p>
<p>&lt;/ion-tabs&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>(5)编辑路由配置模块文件app-routing.module.ts,声明并注册路由词典<br>const routes = [<br>{path: ", component: IndexComponent},<br>{path: 'product-list', component: ProductListComponent},</p>
<p>{path: 'product-detail/:pid', component: ProductDetailComponent},</p>
<p>{path: 'cart', component: CartComponent},<br>{path: 'login', component: LoginComponent},<br>{path: **',component: NotFoundComponent},<br>];<br>此时可以使用客户端进行测试,访问页签中的每个按钮,可以在路由出口显示对应路由组件页面<br><br></p>
<p>--------------------------------------------------------------------------------------------</p>
<p>&nbsp;(6)开始修改主页组件模板: index.component.html, 添加页面内容</p>
<p>&lt;ion-header&gt;<br>img + ion-searchbar<br>&lt;/ion-header&gt;<br>&lt; ion-content&gt;<br>slides + ion-item +ion-grid&gt;ion-card + ...<br>&lt; /ion-content&gt;</p>
<p>-------------------------------------------------------------------------------------------</p>
<p>&nbsp;</p>
<p>(7)修改商品列表页模板: product-list.component.html, 添加页面内容<br>&lt;ion-header&gt;<br>ion-button + ion-searchbar<br>&lt;/ion-header&gt;<br>&lt;ion-content&gt;<br>ion-card&gt; ion-item+ ion-infinite-scroll + ion-text<br>&lt;/ion-content&gt;<br>模型数据: productList、 pno、 hasMore、 http</p>
<p>&nbsp;------------------------------------------------------------------------------------------</p>
<table style="height: 32px; width: 329px" border="0">
<tbody>
<tr>
<td style="text-align: left">
<p>解释跨域请求:</p>
<p>跨域请求是浏览器的一种安全策略,浏览器禁止xml访问另外一个不同域下的资源,可以是不同协议、不同端口、不同域名,只要有一点不一样就算跨域,出于安全考虑不允许使用数据</p>
<p>跨域请求解决方案:<br>jsonp方案 :缺点是只能发get请求、效率偏低在dom树上动态创建script</p>
<p>cors方案:只适合前后端是一家的情况</p>
<p>服务器端代理</p>

</td>

</tr>

</tbody>

</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>HTML元素属性(Attribute)和JS DOM对象的属性(Property)<br>①元素属性和对象属性同名:<br>&lt;img src= " Xxx"&gt;<br>document.createElement('img').src= "xx"<br>②元素属性和对象属性不同名:<br>&lt;input&nbsp; &nbsp;class="box" tabindex="3" &gt;<br>document.createElement('box' ).className= "box"<br>document.createElement( box').tabIndex= "3"<br>③元素属性在对象属性不存在:</p>
<p>&lt;td colspan="3"&gt;<br>document.createElement('td").<span style="text-decoration: line-through; color: rgba(255, 0, 0, 1)">colSpan</span>= "box"<br>④对象属性在元素属性中不存在<br>document.createElement('div').innerHTML = 'abcd'<br>&lt;div&nbsp;<span style="text-decoration: line-through"><span style="color: rgba(255, 0, 0, 1); text-decoration: line-through">innerHTML</span></span>=""&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>自定义一个管道内俩种模式</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200730155813934-176758940.png"></p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1824716/202007/1824716-20200730160107647-1040849276.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>




</td>




</tr>
<tr>
<td>&nbsp;</td>











</tr>











</tbody>











</table><br><br>
来源:https://www.cnblogs.com/liuqingqing-bloom/p/13363877.html
頁: [1]
查看完整版本: Angular