写点什么

Angular 应用”老手“也未必掌握的十大实用特性

  • 2019-12-19
  • 本文字数:3846 字

    阅读完需:约 13 分钟

Angular应用”老手“也未必掌握的十大实用特性

如果你已经是编写 Angular 应用的”老手“,可能会觉得这篇文章介绍的这些特性自己肯定都很熟悉。但事实未必如此,不信的话等你看完再说。

1. Title

Title 标签是一个 HTML 元素,用于指定网页标题。Title 标签作为给定结果的可点击标题,显示在搜索引擎结果页面(SERP)上。它们对于可用性、SEO 和社交共享而言至关重要。


Angular应用使用 index.html 中的…,在浏览器窗口中设置标题。导航到 Angular 中的组件不会更改标题。


那么你知道吗,其实可以通过组件来设置浏览器标题。


Angular 在 @angular/platform-browser 中有一个 Title 服务。我们只需将 Title 服务注入到组件中,并使用 setTitle 方法设置标题即可。


import { Title } from "@angular/platform-browser"@Component({    ...})export class LoginComponent implements OnInit {    constructor(private title: Title) {}    ngOnInit() {        title.setTitle("Login")    }}
复制代码


当我们导航到 LoginComponent 时,浏览器的标题将设置为“Login”。


我们可以在项目的所有组件中重复这一操作,这样在导航到它们的位置时,浏览器窗口将更改为组件设置的标题。

2. Meta

我们的 Angular 应用渲染的内容大部分来自于 index.html。我们的应用会拥有在 index.html 中设置的一个 meta 标签。Angular 在 @angular/platform-browser 中有一个 Meta 服务,使我们能够从组件中设置 meta 标签。


这是很有用的功能,可以更好地进行搜索引擎优化(SEO),也可以将组件拥有的页面共享给社交媒体。


根据维基百科的定义:


Meta是 HTML 和 XHTML 文档中使用的标签,用于提供网页的结构化元数据。它们是网页 head 的一部分,可以在同一页面上使用具有不同属性的多个 Meta 元素。Meta 元素可用于指定页面描述、关键字,以及其他 head 元素和属性未提供的元数据。


Meta 元素提供有关网页的信息,搜索引擎可以在这些信息的帮助下正确地分类网页。


它用起来非常容易,只需从 @angular/platform-browser 导入 Meta,并将其注入到我们的组件中即可。


import { Meta } from "@angular/platform-browser"@Component({    ...})export class BlogComponent implements OnInit {    constructor(private meta: Meta) {}    ngOnInit() {        meta.updateTag({name: "title", content: ""})        meta.updateTag({name: "description", content: "Lorem ipsum dolor"})        meta.updateTag({name: "image", content: "./assets/blog-image.jpg"})        meta.updateTag({name: "site", content: "My Site"})    }}
复制代码


有了它,我们的 BlogComponent 可以渲染在 Facebook 和 Twitter 等网页上,并带有我们组件的描述信息,提供标题、图像和注释。


这个你也听过吗?

3. 覆盖模板插值

我们都在模板中使用默认模板插值器{{}}来显示组件中的属性。


开头为{{,结尾为}}。如果我们在它们之间放置一个属性成员,它将渲染在浏览器 DOM 上。


你知道我们可以用自己的符号覆盖默认的封装开始和结束定界符吗?很简单,在 Component 装饰器的 interpolation 属性中指定即可。


@Component({    interpolation: ["((","))"]})export class AppComponent {
复制代码


AppComponent 模板中使用的插值将不再是“{{}}”,而是“(())”。


@Component({    template: `        <div>            ((data))        </div>    `,    interpolation: ["((","))"]})export class AppComponent {    data: any = "dataVar"}
复制代码


在渲染时,将渲染“dataVar”以代替((data))。

4. Location

我们可以使用 Location 服务获取当前浏览器窗口的 URL。根据所使用的 LocationStrategy,Location 将存储 URL 的路径或 URL 的哈希段。


有了 Location,我们可以转到一个 URL,在平台的历史记录中向前或向后跳转,更改浏览器 URL,替换平台的历史记录栈中的顶部项等。


我们从 CommonModule 注入 Location 服务,就可以使用它了。


import { Location } from "@angular/common"@Component({    ...})export class AppComponent {    constructor(private location: Location) {}    navigatTo(url) {        this.location.go(url)    }    goBack() {        location.back()    }    goForward() {        location.forward()    }}
复制代码

5. DOCUMENT

有时我们想要获取文档模型,以便我们可以从 Angular 应用中执行 DOM 操作。


使用 DOCUMENT 就可以做到这一点。DOCUMENT 是表示主要渲染上下文的 DI 令牌。在浏览器中这就是 DOM 文档。它以与环境无关的方式提供 DOM 操作。


注意:当应用程序上下文和渲染上下文不同时(例如将应用程序运行到 Web Worker 中时),Document 可能在应用程序上下文中不可用。


假设我们在 html 中有一个元素:


<canvas id="canvas"></canvas>
复制代码


我们可以注入 DOCUMENT 来获取画布 HTMLElement:


@Component({})export class CanvasElement {    constructor(@Inject(DOCUMENT) _doc: Document) {}}
复制代码


我们可以调用 getElementById(),获得画布的 HTMLElement。


@Component({})export class CanvasElement {    constructor(@Inject(DOCUMENT) _doc: Document) {}    renderCanvas() {        this._doc.getElementById("canvas")    }}
复制代码


我们还可以使用 ElementRef 和模板引用来安全地执行此操作,理解即可。


警告:要小心!直接与 DOM 交互是危险的,并且可能带来 XSS 风险。

6. @Attribute 装饰器

我们在 Angular 应用中主要使用 Component、Module 和 Directive 装饰器。


我们有一个 Attribute 装饰器,它使我们能够消除对静态字符串的更改检测,这样在传递静态字符串时就不会降低性能了。


Attribute 装饰器的值只检查一次,之后就不再检查了。它们的用法类似于 @Input 装饰器:


@Component({    ...})export class BlogComponent {    constructor(@Attribute("type") private type: string ) {}}
复制代码

7. HttpInterceptor

就像美国的防空网一样,这是 Angular 中非常强大的功能。它会拦截 HttpRequest 并处理它们。


大多数拦截器会在调用 next.handle(transformedReq),以将传出请求传递到链中的下一个拦截器之前对请求进行转换。


在极少数情况下,拦截器可能希望自己完全处理请求,而不是委托给链的其余部分。这种行为是允许的。


HttpInterceptor 可用于:


  • 认证

  • 缓存

  • 伪后端

  • URL 转换

  • 修改标头


它用起来很简单,首先创建一个服务并实现 HttpInterceptor 接口。


@Injectable()export class MockBackendInterceptor implements HttpInterceptor {    constructor() {}    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {        ...    }}
复制代码


然后将其它插入你的主模块中:


@NgModule({    ...    providers: [        {            provide: HTTP_INTERCEPTORS,            useClass: MockBackendInterceptor,            multi: true        }    ]    ...})export class AppModule {
复制代码

8. AppInitializer

有时我们确实希望在 Angular 应用启动时运行一段代码,这段代码可能会加载一些设置,比如加载缓存,加载配置或进行某些签入。AppInitialzer 令牌可以帮助你解决这一问题。


APP_INITIALIZER:初始化应用时执行的函数。


它很容易使用。如果我们希望在 Angular 应用启动时执行以下 runSettings 函数:


function runSettingsOnInit() {    ...}
复制代码


只需转到主要模块 AppModule,并将它添加到其 NgModule 装饰器中的 provider 部分:


@NgModule({    providers: [        { provide: APP_INITIALIZER, useFactory: runSettingsOnInit }    ]})
复制代码

9. 引导监听器

就像 AppInitializer 一样,Angular 还有一项功能,使我们能够在引导组件时进行侦听。它就是 APP_BOOTSTRAP_LISTENER。


通过此令牌提供的所有回调将为每个引导的组件调用。


我们有很多理由来侦听组件引导,例如,Router 模块使用它来破坏和创建基于路由导航的组件。


要使用 APP_BOOTSTRAP_LISTENER,请使用回调函数将其添加到 AppModule 的 provider 部分中:


@NgModule({    {        provide: APP_BOOTSTRAP_LISTENER, multi: true,         useExisting: runOnBootstrap    }    ...})export class AppModule {}
复制代码

10. NgPlural

复数表示是一个问题。我们需要一直根据单数/复数值来在我们的应用中正确定义语法。某些网站会使用(s)。比如:


1 component(s) removed3 component(s) removed
复制代码


读者应在阅读时自行删除或添加(s)****。


Angular 在其 NgPlural 指令中为我们解决了这个问题。


NgPlural 基于数字值来添加/删除 DOM 子树,为复数量身定制。


显示与切换表达式值匹配的 DOM 子树,否则显示与切换表达式的复数类别匹配的 DOM 子树。


要使用此指令,你必须提供一个容器元素,该元素将[ngPlural]属性设置为一个 switch 表达式。具有[ngPluralCase]的内部元素将根据其表达式显示:


<p [ngPlural]="components">    <ng-template ngPluralCase="=1">1 component removed</ng-template>        <ng-template ngPluralCase=">1">{{components}} components removed </ng-template>    </p>
复制代码


看到了吧,当显示“已删除的组件”数量时,我们使用 NgPlural 指令删除了(s)。它将显示:


// if 1 component1 component removed// if 5 components5 components removed
复制代码

小结

全篇看下来,有没有丧失信心、觉得自己老了?


不用担心,我们所有人都有知识盲区。上面所列的内容只是其中一部分,Angular 既庞大又复杂。可以试着查看其他 Angular 相关的内容,看看是否可以找出你以前从未听说过的特性。期待你的发现。


原文链接


10 Useful Angular Features You’ve Probably Never Used


2019-12-19 15:212372

评论

发布
暂无评论
发现更多内容

成本节省 50%,10 人团队使用函数计算开发 wolai 在线文档应用

阿里巴巴中间件

阿里云 中间件 函数计算

人人皆为开发者?不可错过的低代码发展新趋势

云智慧AIOps社区

大前端 低代码 数据可视化

混合办公首选轻薄本,华为MateBook的“三重变身”改变了什么?

脑极体

在星云科技,我们使用 Zadig 实现多环境并行发布,上千次周部署

Zadig

DevOps 云原生 CI/CD 软件交付

直播预告丨Hello HarmonyOS进阶课程第四课——ArkUI动画开发

HarmonyOS开发者

HarmonyOS arkui

干货复盘 | 易观分析“出海非洲战略”专题分享

易观分析

非洲战略

热烈庆祝“海泰密码技术融合创新中心&数据中心重启安全工程”双中心智能重启用

电子信息发烧客

网络安全 科技 科技企业

做了5年开源项目,我总结了以下提PR经验!

OpenHarmony开发者

OpenHarmony 开源生态

“双碳”大局中再看业务合同电子化

鲸品堂

节能 提效降本 双碳

Apache SeaTunnel(Incubating)与计算引擎的解耦之道,重构API我们做了些什么

Apache SeaTunnel

Apache 大数据 开源 DolphinScheduler workflow

使用 Provider 实现 Flutter 不相关页面状态数据共享

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

【刷题第16天】数组中出现次数超过一半的数字

白日梦

5月月更

前端食堂技术周刊第 38 期:Remix v1.5.0、Babel v7.18.0、前端部署十五章、Tree Shaking 问题排查指南、一文搞懂前端技术发展

童欧巴

前端 Remix 前端部署

十、云原生网络架构

穿过生命散发芬芳

网络架构 5月月更

第一梯队,增速第一

天翼云开发者社区

多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单

蒋川

Vue Element 组件 表单设计 Ant Design

小程序和App同时拥有?两者兼得的一种技术方案

Speedoooo

微信小程序 APP开发 小程序容器 小程序转app

我们为什么选择使用分布式持续交付新星 Zadig ?

Zadig

DevOps 云原生 CI/CD 软件交付

Markdown语法简介

工程师日月

markdown语法 5月月更

企业引流和留存,“App+小程序”是较优技术策略

Speedoooo

微信小程序 APP开发 小程序容器 小程序转app

IET 试水SiFL中文项目 为中国工程师“走出去”创造宝贵机遇

E科讯

Hoo研究院|区块链简报 20220523期

区块链前沿News

#区块链# Hoo 热点

使用postMessage对iframe进行跨域数据传输

空城机

iframe postMessage 5月月更

天翼云成为“云优化能力提升计划”首批成员单位!

天翼云开发者社区

创业、女性、数字化:后COVID-19世界的复苏“铁三角”

脑极体

Apache ShenYu 网关正式支持 Dubbo3 服务代理

阿里巴巴中间件

阿里云 开源 微服务 云原生 dubbo

10分钟,将微信小程序转换成App

Speedoooo

微信小程序 移动开发 小程序容器 小程序转app

linux之tar使用技巧

入门小站

Linux

为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?

宇宙之一粟

线程 进程 5月月更

英伟达周锡健:设计到数字营销的最后一公里

阿里云弹性计算

vr XR 视觉计算

一文学完Linux常用命令

编程攻略

Linux

Angular应用”老手“也未必掌握的十大实用特性_大前端_Chidume Nnamdi_InfoQ精选文章