angular?!小白修仙之路……

2023-11-10

一、   简介

Angular是一个功能非常完备的前端框架,最早由 Misko Hevery 等人创建,2009 年被Google 公式收购,用于其多款产品。Angular基于TypeScript,通过增强HTML的方式提供一种便捷开发Web应用程序的方式。

这里主要介绍在angular开发使用后的一些经验总结,还有踩过的坑。

二、典型功能

1、绑定

绑定是一项很好用的功能,也是angular的特点之一。


(1)  事件绑定

<button (click)="doClick($event)">按钮</button>

 

(2)  属性绑定

<img [src]="imgUrl"/>

<img src="{{imgUrl}}"/>

<td [attr.colspan]="size"></td>

<span [attr.name]="name"></span>

 

(3)  Class绑定

<div [class]="divClass"></div>

<div [ngClass]="{number>3?divClass1:divClass2}"></div>

<div [ngClass]="{divClass:number>3}"></div>

 

(4)  样式绑定

<div [style]="divStyle"></div>

<div [style.color]="{number>3?red:green}"></div>

<div [ngStyle]="{divStyle:number>3}"></div>

   

(5)  双向绑定

<input [(ngModel)]="form.name"/>

<label">{{name}}</label>

 

2、 Form表单验证

Angular的form表单提供了简单方便的验证方法,及样式控制,这里举个简单的例子。关键部分是#addForm#name


<div>

   <formclass="form-inline" #addForm="ngForm">

     <divclass="form-group">

       <labelfor="name"class="control-label"><spanstyle="color:red;">*</span>名称:</label>

       <inputclass="form-control" [(ngModel)]="form.name"required #name="ngModel"/>

       <div [hidden]="name.valid|| name.pristine"class="alertalert-danger">名称不能为空</div>

     </div>

   </form>

   <buttontype="submit"class="btnbtn-ok" (click)="saveName()"  [disabled]="!addForm.form.valid">保存</button>

</div>

 

3、管道使用

管道是一个很好用的功能,可以多页面公用处理方法,使用简单。可以使用angular内置管道,也可以自定义管道


<span>{{time |date: 'y-MM-dd HH:mm:ss'}}</span>

<span>{{status |statusPipe}}</span>


自定义管道方法

import {Pipe, PipeTransform } from'@angular/core';

@Pipe({

  name:'statusPipe'

})

exportclassStatusPipePipeimplementsPipeTransform {

  transform(value:any, args?: any):any {

    lettransVal ='';

    switch (value) {

     case'activated':

       transVal ='已激活';

       break;

     case'unactivated':

       transVal ='未激活';

       break;

    }

    returntransVal;

  }

}

 

4、路由

路由有很多配置参数,这里只举例路由传参 /login/1?name=1


页面中路由跳转

<a [routerLink]="['/login',1]"[aueryParams]="{name:1}"target="_blank">login</a>


Ts中路由跳转

this.router.navigate(['login',1],{ queryParams: { name: 1 } });

 

5、拦截器

Web项目中发送请求是比不可少的,一般使用统一的http请求服务,对请求进行统一的拦截处理是一个常用操作。


post (url:string, params?: any) {

    url = this.getUrl(url);

    returnthis.http.post(url,params)

     .toPromise()

     .then(this.intercept) // 使用拦截器

     .catch(this.handleError);

  }

 

// 拦截器

privateintercept(res :any){

    if (res["_body"].indexOf("noright") > 0) {

     alert("没有权限访问");

    }else{

    returnres.json();

    }

  }

 

6、组件通信

组件是Angular的一个特色,组件的使用方便了代码复用。Angular提供了组件直接通信的方法。

 

父组件属性count传给子组件,子组件方法save返回父组件。


<divclass="parent">

  <app-child #childComponent [count]="count" (save)="onSave($event)"></app-child>

</div>

 

子组件使用@Input@Output来进行通信。通过@Input获取父组件count值,通过@Output将数据传递给父组件。


exportclassChildComponentimplementsOnInit  {

  @Input()privatecount:number;

@Output()save: EventEmitter<any> =newEventEmitter();

privatename:string;

 

saveCall(event:any) {

    this.count++;

    that.save.emit(this.count);

  }

edit() {

    this.count=5;

  }

 

}

 

父组件在onSave方法接收子组件传递过来的值,另外父组件也可以使用ViewChild调用子组件属性和方法。


exportclassParentComponentimplementsOnInit  {

  @ViewChild('childComponent')childComponent:ChildComponent;

 

ngOnInit() {

    this.childComponent.name='Lily';

    this.childComponent.edit();

  }

 

// 保存回调

  onSave(data:any) {

    console.log(data);

  }

}

 

三、踩坑经验

1、 typescript中this和javascript function 中的this冲突

javascriptfunction中调用typescript中方法,导致this指向并不是我们原始的this问题,原因是 js的代码作用域影响,可以通过下面方法解决。


letthat =this; //重要

// 使用that指向typescript中方法

 

2、 F5刷新跳转首页

angular中路由到某个页面,例如/data,在当前页面刷新,我们期望的是当前页面,实际却跳转到了首页/home。通过设置useHash参数解决,但是url中会增加#号,例如#/home#/data


RouterModule.forRoot(appRoutes, {useHash:true})

 

3、动态显示后端HTML

Web前端开发中,我们经常会遇见需要动态的将一些来自后端或者是动态拼接的HTML字符串绑定到页面DOM显示,angular提供了内置指令[innderHtml]="htmlContent"实现,但是htmlContent中带有的style样式会被过滤。原因是angular自身有一套安全过滤系统,我们必须html标签添加信任,才能正常显示。解决方法是使用angular服务DomSanitizer中的bypassSecurityTrustHtml 方法


前端:

<div [innerHTML]='testHtml'></div>


后端



到这里已经解决问题了。为了不影响源数据和批量使用,可以封装成管道,这样各页面和数据都不用修改,只在前端使用管道即可。




4、 第三方库引入

第三方库引入angular后,有时候会出现加载不出来或者函数不识别、显示不正确等问题,可能有以下三方面的原因:没有声明,页面元素displaynonedom不存在。

第三方库引入后需要声明,例如


declarevarecharts:any;


有些js加载时要求页面元素display不能为none,如果需要控制显示隐藏,可以使用ngIf,不要通过display实现。


<divstyle="display:none"></div>

<div *ngIf="flag==1"></div>


有时候第三方js在页面中不能正常显示,主要是angular的动态加载引起的,因为js加载时页面元素不存在。如果需要在弹窗或者动态生成的元素中加载,可以通过onShown回调或者setTimeout延迟加载,等dom存在之后初始化js就可以正常显示了。

 

四、体验评价

Angular功能很强大,而且使用非常灵活,也很方便集成。缺点是性能,库比较大,页面响应慢。还有一点就是,angular版本变化快,学习曲线陡峭,在开发效率方面需要注意。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular?!小白修仙之路…… 的相关文章

  • ASP.NET MVC (Razor) 与 Angular 5

    我们目前正在考虑从 ASP NET MVC 迁移到 Angular 5 主要是因为它看起来是最好 最新的框架 然而 我们似乎都无法找出为什么 Angular 比 MVC Razor 更好的硬道理 SPA 与 MPA 似乎是不同的方法 但实际
  • 如何在显示 Angular 网站之前加载图像

    我一直在用 Angular 做一个网站 我需要在显示之前加载所有图像 我试图找到一种方法来制作预加载视图 直到所有图像都位于 assets文件夹已加载 但我找不到任何东西 我怎样才能在 Angular 中正确地做到这一点 我可以给你两个选项
  • Rxjs 订阅方法被忽略

    在将其标记为重复之前 请注意这些都不适合我 问题1 https stackoverflow com questions 38142278 subscribe method is not triggered with rxjs 问题2 htt
  • 使用 DI 进行单元测试和模拟服务

    我已经为此苦苦挣扎了一段时间 希望有人能提供帮助 我有一个使用服务来获取数据的组件 我正在尝试向其添加单元测试 我的问题是测试总是失败并显示 错误 没有 Http 提供程序 这是我的代码 Service import Injectable
  • 获取对组件树上某种类型的所有指令的引用

    我有一个复杂的场景 需要帮助 我有一个指令 称为TagDirective 它被放置在我的应用程序中的多个元素上 我有另一个指令 QueryDirective 需要引用的所有实例TagDirective存在于其宿主元素以及层次结构中其上方的所
  • Ionic2 + Angular2 - 带有离子图标星的动态速率值

    我正在尝试构建一个从 0 到 5 颗星的简单动态速率 及其中间值 如 x 5 示例 4 5 该速率从 javascript 接收值 我用 ngFor 寻找一些东西 但我不明白它是如何工作的 有人可以解释 帮助我吗 如果有帮助的话 对于 io
  • 批处理文件运行 npm start

    我有一个角度应用程序 可以使用命令启动npm start在控制台中 现在我想创建一个批处理文件 在启动时执行 npm install 这是我创建的批处理文件 前端 bat cd
  • 从 SERVICE 执行 COMPONENT 方法

    我正在尝试执行一个组件method from a 服务方式 我看到了另外 2 个线程 Link1 如何从服务调用组件方法 https stackoverflow com questions 40788458 how to call comp
  • 使用ngx-print打印图像的问题

    图像未使用 ngx print 打印 我不确定我在这里做错了什么 HTML
  • Angular 4 Subscribe方法多次调用

    我正在创建一个全局模态组件 我的问题是 当我调用 subscribe 方法时 它会根据调用的模态数量多次调用 如何防止对可观察订阅方法的多次调用 请检查下面我的代码 提前致谢 模态 model ts export class Modal t
  • Angular/RxJS 我什么时候应该取消订阅“订阅”

    我什么时候应该储存Subscription实例并调用unsubscribe 在此期间ngOnDestroy生命周期以及什么时候我可以忽略它们 保存所有订阅会给组件代码带来很多混乱 HTTP 客户端指南 https angular io do
  • 回调在 Angular2/Firebase 中生成“TypeError:这是未定义的”

    我试图了解这里发生了什么以及为什么如果我以某种方式调用函数时会收到错误 而当我以不同的方式调用函数时却不会收到错误 这是首先产生错误的方式 播放器 service ts 文件 in the Injectable i have private
  • Angular 2/4 编辑表单填充 FormArray 控件

    我正在尝试为具有嵌套属性 FormArray 的模型实现编辑表单 我在语法上遇到了问题 并且不确定我是否走在正确的轨道上 主表单的属性有效 这是我遇到问题的嵌套表单 这是我到目前为止所拥有的 这里我发起表单组 private initFor
  • ngTemplateOutlet - Angular 5 嵌套模板驱动表单

    我有一个从我的组件之一传递的 ng template 并且我有一个占位符来接受传递的 ng template 到我的组件上 如下 ngTemplateOutlet 中所示 div div
  • 如何将超级组件类变量访问到子组件类中?

    我如何在 Angular2 中将超级组件类变量访问到子组件中 超级组件文章 ts Component selector article View templateUrl components article article html v s
  • Angular2 如何将父组件注入到指令中(仅当它存在时)?

    我的自定义表格组件有一个全选指令 我希望我的指令的用户能够通过两种方式实例化它 1
  • 输入属性在 ngx-charts 模板中不起作用

    按照这个answer https stackoverflow com questions 47826641 ngx charts cant load bar charts directly with async pipe in angula
  • 使用 ngrx 时 Angular 4 解析未完成

    我正在尝试在我的应用程序的解析中使用 ngrx 但由于某种原因它不起作用 这就是我之前获得它的方式 在我的解析路由中使用一个简单的服务 resolve return this service getData map data gt data
  • 角度2问题错误TS1068:意外的令牌。需要构造函数、方法、访问器或属性。应用程序/chat.component.ts

    当我运行 npm start 时遇到以下问题 app chat component ts 20 9 错误 TS1068 意外的令牌 需要构造函数 方法 访问器或属性 app chat component ts 47 1 错误 TS1128
  • 将 formControlName 与 之类的内容一起使用

    我有一个动态表单 显示我通过 REST 获得的多个数据集 用户将编辑此数据集 然后只需提交它即可将其发送回服务器 该表单是动态构建的FormBuilder array 并循环通过formArrayName ngFor在我的模板中 每个数据集

随机推荐

  • 强化学习笔记-13 Policy Gradient Methods

    强化学习算法主要在于学习最优的决策 到目前为止 我们所讨论的决策选择都是通过价值预估函数来间接选择的 本节讨论的是通过一个参数化决策模型来直接根据状态选择动作 而不是根据价值预估函数来间接选择 我们可以定义如下Policy Gradient
  • 2013电商“三国杀”

    2013电商 三国杀 本周 DCCI发布了 Forecast2013 中国电子商务蓝皮书 蓝皮书预测 2013年 淘宝 京东和腾讯将成为电商三甲 纵观中国电商的2012年 高调的京东 霸气的淘宝和默默耕耘的腾讯 似乎正在勾画着未来中国电商行
  • python time.sleep(t) t为秒

    睡眠5秒 import time time sleep 5
  • location.href 与 location.search

    document location href 返回完整的 URL 如 http www cftea com foo asp p 1 引用 location search是从当前URL的 号开始的字符串 如 http www 51js com
  • 《计算机视觉中的多视图几何》笔记(2)

    2 Projective Geometry and Transformations of 2D 本章主要介绍本书必要的几何知识与符号 文章目录 2 Projective Geometry and Transformations of 2D
  • 元素和小于等于阈值的正方形的最大边长

    LeetCode 1292 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold 请你返回元素总和小于或等于阈值的正方形区域的最大边长 如果没有这样的正方形区域 则返回 0 示
  • QT 信号发送多个参数

    你可以把多个参数包装为一个类发送 实测是可以的
  • DBUS及常用接口介绍

    1 概述 1 1 DBUS概述 DBUS是一种高级的进程间通信机制 DBUS支持进程间一对一和多对多的对等通信 在多对多的通讯时 需要后台进程的角色去分转消息 当一个进程发消息给另外一个进程时 先发消息到后台进程 再通过后台进程将信息转发到
  • Caused by: java.lang.ClassNotFoundException: org.springframework.core.KotlinDetector

    Exception in thread main java lang IllegalArgumentException Cannot instantiate interface org springframework context App
  • win下从NUMA节点分配内存

    微软官网链接 https docs microsoft com zh cn windows win32 memory allocating memory from a numa node redirectedfrom MSDN 示例代码 d
  • Java高级教程

    Java高级教程 Java11文档 Java数据结构 Java工具包提供了强大的数据结构 在Java中的数据结构主要包括以下几种接口和类 枚举 Enumeration 位集合 BitSet 向量 Vector 栈 Stack 字典 Dict
  • Error loading workspace: You are outside of a module and outside of $GOPATH/src. If you are using mo

    1 描述 如果你使用vsCode去编译 go 项目的时候 出现这个错误 那么并不是你的go moudle 除了问题 同时你会发现执行Run Code也是执行失败的 2 原因 你的工作区默认是项目根目录 但你单开的文件并不是项目根目录 3 解
  • lvgl8.2 img 图片显示

    1 lvgl 图片显示源 为了提供良好的图片显示灵活性 所以显示图像的来源可以是以下三种 代码中的一个变量 一个带有像素颜色数据的 C 数组 存储在外部的文件 比如 SD 卡 带有符号的文本 2 内部图片 对于源码内部图片 将图片转换为图片
  • 前端自动化测试——vue单元测试vue-test-utils

    自动化测试分类 单元测试 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 简单来说 单元就是人为规定的最小的被测功能模块 可能是一个单一函数或方法 一个完整的组件或类 单元测试是最小巧也是最简单的测试 它们通
  • paddlelite编译python版: FIND_PACKAGE called with invalid argument或者fatal: no tag exactly matches 。【已解决】

    报错1 不是这个原因 这个错误不会影像编译 fatal no tag exactly matches 518238f89e84868d666b5cbe6860788934f290d7 tag branch develop commit 51
  • TCP flag注释

    http blog csdn net wisage article details 6049733 三次握手Three way Handshake 一个虚拟连接的建立是通过三次握手来实现的 1 B gt SYN gt A 假如服务器A和客户
  • 【华为OD机试】寻找相同子串(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 若依系统(Ruoyi-Vue)去除redis数据库

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目的 一 去除redis 配置 二 去除ruoyi framework下RedisConfig的配置 三 在ruoyi common的core redis下新建My
  • 领域驱动设计-Domain-Driven-Design概念

    2021了 你应该要了解DDD了 不然领导和你吹牛你都听不懂 或者你都没法和别人吹牛了 一 Evans DDD 是什么 1 1 背景 2002年 敏捷宣言诞生 时代处于 CS 到 BS 的转换时期 2003年 Eric Evans 发表 l
  • angular?!小白修仙之路……

    一 简介 Angular是一个功能非常完备的前端框架 最早由 Misko Hevery 等人创建 2009 年被Google 公式收购 用于其多款产品 Angular基于TypeScript 通过增强HTML的方式提供一种便捷开发Web应用