深入解析:Angular【基础语法】

news/2025/11/27 17:30:12/文章来源:https://www.cnblogs.com/gccbuaa/p/19278856

在这里插入图片描述

插值

文本绑定

<p>Message: {{ msg }}</p>
<p [innerHTML]="msg"></p>

属性绑定

<!-- 写法一 --><img src="{{ heroImageUrl }}"><!-- 写法二,推荐 --><img [src]="heroImageUrl"><!-- 写法三 --><img bind-src="heroImageUrl">

在布尔特性的情况下,它们的存在即暗示为 true,属性绑定工作起来略有不同,在这个例子中:

<button [disabled]="isButtonDisabled">Button</button>

如果 isButtonDisabled 的值是 nullundefinedfalse,则 disabled 特性甚至不会被包含在渲染出来的 <button> 元素中。

使用 JavaScript 表达式

<p>1 + 1 = {{ 1 + 1 }}</p>
<p>{{ num + 1 }}</p>
<p>{{ isDone ? '完了' : '没完' }}</p>
<p>{{ title.split('').reverse().join('') }}</p>
<p [title]="title.split('').reverse().join('')">{{ title }}</p>
<ul><li [id]="'list-' + t.id" *ngFor="let t of todos">{{ t.title }}</li>
</ul>

编写模板表达式所用的语言看起来很像 JavaScript。 很多 JavaScript 表达式也是合法的模板表达式,但不是全部。

Angular 遵循轻逻辑的设计思路,所以在模板引擎中不能编写非常复杂的 JavaScript 表达式,这里有一些约定:

  • 赋值 (=, +=, -=, …)
  • new 运算符
  • 使用 ;, 的链式表达式
  • 自增或自减操作符 (++--)

列表渲染

基本用法:

export class AppComponent {
heroes = ['Windstorm', 'Bombasto', 'Magneta', 'Tornado'];
}
<p>Heroes:</p>
<ul><li *ngFor="let hero of heroes">{{ hero }}</li>
</ul>

也可以获取 index 索引:

<div *ngFor="let hero of heroes; let i=index">{{i + 1}} - {{hero.name}}</div>

条件渲染

NgIf

<p *ngIf="heroes.length > 3">There are many heroes!</p>
ngIf<ng-template>
<ng-template [ngIf]="condition"><div>...</div></ng-template>

NgSwitch

NgSwitch 的语法比较啰嗦,使用频率小一些。

<div [ngSwitch]="currentHero.emotion">
<app-happy-hero    *ngSwitchCase="'happy'"    [hero]="currentHero"></app-happy-hero>
<app-sad-hero      *ngSwitchCase="'sad'"      [hero]="currentHero"></app-sad-hero>
<app-confused-hero *ngSwitchCase="'confused'" [hero]="currentHero"></app-confused-hero>
<app-unknown-hero  *ngSwitchDefault           [hero]="currentHero"></app-unknown-hero>
</div>

在这里插入图片描述

事件处理

事件绑定只需要用圆括号把事件名包起来即可:

<button (click)="onSave()">Save</button>

可以把事件对象传递到事件处理函数中:

<button (click)="onSave($event)">On Save</button>

也可以传递额外的参数(取决于你的业务):

<button (click)="onSave($event, 123)">On Save</button>

当事件处理语句比较简单的时候,我们可以内联事件处理语句:

<button (click)="message = '哈哈哈'">内联事件处理</button>

我们可以利用 属性绑定 + 事件处理 的方式实现表单文本框双向绑定:

<input [value]="message"(input)="message=$event.target.value" >

事件绑定的另一种写法,使用 on- 前缀的方式:

<!-- 绑定事件处理函数 -->
<button on-click="onSave()">On Save</button>

表单输入绑定

文本

<p>{{ message }}</p><input type="text" [(ngModel)]="message">

运行之后你会发现报错了,原因是使用 ngModel 必须导入 FormsModule 并把它添加到 Angular 模块的 imports 列表中。

导入 FormsModule 并让 [(ngModel)] 可用的代码如下:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
+++ import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
+++ FormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

通过以上的配置之后,你就可以开心的在 Angular 中使用双向数据绑定了。

多行文本

<textarea cols="30" rows="10" [(ngModel)]="message"></textarea>

复选框

<h3>单选框</h3><input type="checkbox" [(ngModel)]="seen">
<div class="box" *ngIf="seen"></div>

###单选按钮

<input type="radio" [value]="0" [(ngModel)]="gender"><input type="radio" [value]="1" [(ngModel)]="gender"><p>选中了:{{ gender }}</p>

###下拉列表

<select [(ngModel)]="hobby">
<option [value]="0">吃饭</option>
<option [value]="1">睡觉</option>
<option [value]="2">打豆豆</option>
</select>
<p>选中的爱好:{{ hobby }}</p>

Class 与 Style 绑定

Class

<!-- standard class attribute setting  -->
<div class="bad curly special">Bad curly special</div><!-- reset/override all class names with a binding  --><div class="bad curly special"[class]="badCurly">Bad curly</div><!-- toggle the "special" class on/off with a property --><div [class.special]="isSpecial">The class binding is special</div><!-- binding to `class.special` trumps the class attribute --><div class="special"[class.special]="!isSpecial">This one is not so special</div>

NgClass 指令

NgClass 指令接收一个对象,对象的 key 指定 css 类名,value 给定一个布尔值,当布尔值为真则作用该类名,当布尔值为假则移除给类名。

语法规则:

<div [ngClass]="{
css类名: 布尔值,
css类名: 布尔值
}">测试文本</div>

基本示例:

.saveable{
font-size: 18px;
}
.modified {
font-weight: bold;
}
.special{
background-color: #ff3300;
}
currentClasses: {};
setCurrentClasses() {
// CSS classes: added/removed per current state of component properties
this.currentClasses =  {
'saveable': this.canSave,
'modified': !this.isUnchanged,
'special':  this.isSpecial
};
}
<div [ngClass]="currentClasses">This div is initially saveable, unchanged, and special</div>

Style

通过样式绑定,可以设置内联样式。

样式绑定的语法与属性绑定类似。 但方括号中的部分不是元素的属性名,而由style前缀,一个点 (.)和 CSS 样式的属性名组成。 形如:[style.style-property]

<button [style.color]="isSpecial ? 'red': 'green'">Red</button>
<!-- 也可以 backgroundColor -->
<button [style.background-color]="canSave ? 'cyan': 'grey'" >Save</button>

有些样式绑定中的样式带有单位。在这里,以根据条件用 “em” 和 “%” 来设置字体大小的单位。

<button [style.font-size.em]="isSpecial ? 3 : 1" >Big</button>
<button [style.font-size.%]="!isSpecial ? 150 : 50" >Small</button>

提示:样式属性命名方法可以用中线命名法,像上面的一样 也可以用驼峰式命名法,如fontSize

NgStyle 指令

虽然这是设置单一样式的好办法,但我们通常更喜欢使用 NgStyle指令 来同时设置多个内联样式。

currentStyles: {};
setCurrentStyles() {
// CSS styles: set per current state of component properties
this.currentStyles = {
'font-style':  this.canSave      ? 'italic' : 'normal',
'font-weight': !this.isUnchanged ? 'bold'   : 'normal',
'font-size':   this.isSpecial    ? '24px'   : '12px'
};
}
<div [ngStyle]="currentStyles">This div is initially italic, normal weight, and extra large (24px).
</div>

ngStyle 这种方式相当于在代码里面写 CSS 样式,比较丑陋,违反了注意点分离的原则,而且将来不太好修改,非常不建议这样写(足够简单的情况除外)。

Angular 中的计算属性

模板引用变量

模板引用变量通常用来引用模板中的某个DOM元素,它还可以引用Angular组件或指令或Web Component。

使用井号 (#) 来声明引用变量。 #phone的意思就是声明一个名叫phone的变量来引用<input>元素。

<input #phone placeholder="phone number">

我们可以在模板中的任何地方引用模板引用变量。 比如声明在<input>上的phone变量就是在模板另一侧的<button>上使用的。

<input #phone placeholder="phone number"><!-- lots of other elements --><!-- phone refers to the input element; pass its `value` to an event handler --><button (click)="callPhone(phone.value)">Call</button>

大多数情况下,Angular会把模板引用变量的值设置为声明它的那个元素。在上面例子中,phone 引用的是表示电话号码<input>框。 "拨号"按钮的点击事件处理器把这个input值传给了组件的callPhone方法。 不过,指令也可以修改这种行为,让这个值引用到别处,比如它自身。 NgForm指令就是这么做的。

模板引用变量使用注意:

  • 模板引用变量的作用范围是整个模板。 不要在同一个模板中多次定义同一个变量名,否则它在运行期间的值是无法确定的。
  • 如果我在模板里面定义的局部变量和组件内部的属性重名会怎么样呢
    • 如果真的出现了重名,Angular 会按照以下优先级来进行处理
    • 模板局部变量 > 指令中的同名变量 > 组件中的同名属性
  • 我们也可以用ref-前缀代替#。 下面的例子中就用把fax变量声明成了ref-fax而不是#fax
<input ref-fax placeholder="fax number">
<button (click)="callFax(fax.value)">Fax</button>

过滤器

在 Angular 中,过滤器也叫管道。它最重要的作用就是用来格式化数据的输出。

举个简单例子:

public currentTime: Date = new Date();
<h1>{{currentTime | date:'yyyy-MM-dd HH:mm:ss'}}</h1>

Angular 一共内置了16个过滤器:https://angular.io/api?type=pipe。

在复杂业务场景中,内置的过滤器肯定是不够用的,所有 Angular 也支持自定义过滤器。

管道还有另外一个重要的作用就是做国际化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微波烘干设备哪家好?国内优质企业及业务解析

微波烘干设备作为一种高效节能的干燥设备,广泛应用于食品、医药、化工、农业等多个领域,其利用微波技术实现快速均匀加热,在提升生产效率的同时降低能耗,成为现代工业生产中不可或缺的关键设备。选择合适的微波烘干…

U635097 有向图

首先考虑 DAG 计数,设 \(f_{s, s}\) 表示目前确定的点集为 \(s\),最后一层点为 \(s\),因为我 DAG 计数按照拓扑序一定是一层层转移的,你会发现这个状态数是 \(O(4^n)\),直接爆炸了。 比较神秘的优化是,去掉 \(s\…

升级Win11专业工作站版密钥

Win11专业工作站版性能极其强大,拥有深度优化的系统内核,充分释放多核处理器与显卡性能。无论大型游戏、专业渲染还是多任务处理,都能稳定高效运行,是追求顶级性能用户的最佳选择。 密钥地址:http://ruan.fun (在…

多线程+asyncio端口扫描器

#!/usr/bin/env python3 """ 多线程+asyncio端口扫描器 结合了异步IO和多线程技术,实现高效的端口扫描功能 """import asyncio import socket import threading import time import ar…

U635735 Treap=Tree+Heap

结论是建出笛卡尔树后每个结点的深度相当于从这个结点向前向后严格前后缀最大值个数,那么路径长度等价于这个,我们只需要快速维护这个即可。 这是单侧递归线段树模板题,使用线段树即可做到 \(O(n \log^2 n)\)。

Docker客户端控制局域网服务器 - a-cool

需求 在局域网内开放Docker服务器的2375端口,让Windows Docker客户端能够远程操作. 注意 以目前这种方式开放2375端口,相当于在没有密码的情况下将你服务器的root权限暴露在局域网中​。 生产环境或对公网开放绝对不…

时序约束记录

快时钟到慢时钟域约束 最近在看xilinx UG903手册,手册中针对快时钟到慢时钟使用multicycle 约束的描述如下:使用如下约束 set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2] set_…

U635732 木叶下

求连了一条边后,所有点到这个环的距离最大值。 那么你发现难点其实在于求一个点挖掉一个子树后的答案,对于一条链求这个东西其实并不简单。 一个好做的方法是,我们对于每个结点记录它父亲挖掉它的最大值,这样每个结…

U635734 神机

一个经典结论是图上所有环都可以被简单环组合出来。 那么本题相当于要求一条边必须出现在所有的奇环中并且不能出现在所有的偶环中,使用树上差分求解即可。

2025深圳粉末冶金展机构权威推荐榜单:2025青岛家博会‌/2025深圳跨境电商展‌/2025新加坡海鲜展源头机构精选

在高端制造业转型升级与新材料技术加速迭代的背景下,深圳粉末冶金展览会作为产业链资源整合与创新成果展示的关键平台,其组织水平与资源整合能力直接影响参展成效。据行业数据显示,2025年中国粉末冶金市场规模预计突…

U635730 二叉树

首先发现是一个区间 DP 的形式,那么这些限制就是限制了某些位置不能转移,可以差分一下看哪些位置可以转移。

2025年宽幅等离子清洗机优质厂家权威推荐榜单:真空等离子清洗机/大气等离子清洗机/等离子体清洗机源头厂家精选

宽幅等离子清洗机作为现代制造业表面处理的关键装备,其处理均匀性、稳定性与效率直接关系到电子、半导体、汽车等行业产品的良率与性能。随着精密制造要求的提升,市场对大尺寸、高效率、高稳定性的等离子清洗设备需求…

深入解析:简单、高效且低成本的预训练、微调与服务,惠及大众基于 Ray 架构设计的覆盖大语言模型(LLM)完整生命周期的解决方案byzer-llm

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF1985G-D-Function

CF1985G-D-Function 题目大意 \(D(n)\) 表示 \(n\) 的数字之和。对于多少个整数 \(n\) 满足 \(10^l \le n \le 10^r\) 的条件 \(D(k \cdot n)=k \cdot D(n)\) 。输出答案对 \(10^9+7\) 。 \(Hint\) 对于满足条件的 \(…

2025 年义乌礼品定制厂家最新推荐榜,聚焦企业生产能力、服务水平与市场认可度多维度解析定制商务礼品 / 公司礼品定制 / 纪念品定制 / 定制伴手礼 / 企业礼品定制 / 客户礼品定制公司推荐

引言 在企业礼赠、员工福利等场景中,优质礼品定制对传递品牌价值意义重大。本次推荐榜参考国际礼品定制行业协会(International Gift Customization Industry Association)2024 - 2025 年度测评数据,该测评覆盖全球…

U636118 二叉搜索树

列出区间 DP 转移式,打表发现可以四边形不等式优化,于是优化到 \(O(n^2)\)。

2025年口碑好的四川种苗基地排名及采购参考

2025 年口碑好的四川种苗基地排名及采购参考在乡村振兴战略持续推进与中药材产业蓬勃发展的背景下,四川作为全国道地药材核心产区,优质种苗基地成为推动产业升级的关键力量。基于基地规模、资质荣誉、品种资源、服务…

2025 年义乌商务礼品厂家最新推荐榜,全链条能力与定制服务双维度深度解析商务伴手礼/商务礼品网/定制商务礼品/商务福利礼品/商务实用礼品公司推荐

引言 商务礼品作为企业形象传递与情感联结的核心载体,其定制品质与服务效率直接影响礼赠价值的实现。当前市场中,68% 的企业采购者面临产品同质化、定制响应滞后、品质管控缺失等痛点,而具备全链条服务能力的品牌仅…

egacy(传统) nftables(较新) 和后端ipvs iptables有关系吗

核心结论(先说重点):legacy / nftables 是 iptables 工具的两种实现后端(backend),它们属于 Linux 内核 netfilter 框架下的用户态工具接口。 iptables / ipvs 是 kube-proxy 的两种代理模式(proxy mode),用于…

2025 年透声膜厂家最新推荐榜,技术实力与市场口碑深度解析手机防水/MIC 防水/耳机防水/手表防水/摄像头防水/监控防水/无氟防水/ePTFE 防水透声膜公司推荐

引言 随着电子、医疗、汽车等行业向高精度防护升级,防水透声膜的性能要求持续攀升。据国际薄膜技术协会(IFTA)2024 年测评数据显示,全球仅 32% 的产品能同时满足 IP68 防水与低于 2dB 声损的双重标准,不合格产品导…