当前位置: 首页 > news >正文

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

在这里插入图片描述

插值

文本绑定

<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.jsqmd.com/news/53048/

相关文章:

  • 微波烘干设备哪家好?国内优质企业及业务解析
  • U635097 有向图
  • 升级Win11专业工作站版密钥
  • 多线程+asyncio端口扫描器
  • U635735 Treap=Tree+Heap
  • Docker客户端控制局域网服务器 - a-cool
  • 时序约束记录
  • U635732 木叶下
  • U635734 神机
  • 2025深圳粉末冶金展机构权威推荐榜单:2025青岛家博会‌/2025深圳跨境电商展‌/2025新加坡海鲜展源头机构精选
  • U635730 二叉树
  • 2025年宽幅等离子清洗机优质厂家权威推荐榜单:真空等离子清洗机/大气等离子清洗机/等离子体清洗机源头厂家精选
  • 深入解析:简单、高效且低成本的预训练、微调与服务,惠及大众基于 Ray 架构设计的覆盖大语言模型(LLM)完整生命周期的解决方案byzer-llm
  • CF1985G-D-Function
  • 2025 年义乌礼品定制厂家最新推荐榜,聚焦企业生产能力、服务水平与市场认可度多维度解析定制商务礼品 / 公司礼品定制 / 纪念品定制 / 定制伴手礼 / 企业礼品定制 / 客户礼品定制公司推荐
  • U636118 二叉搜索树
  • 2025年口碑好的四川种苗基地排名及采购参考
  • 2025 年义乌商务礼品厂家最新推荐榜,全链条能力与定制服务双维度深度解析商务伴手礼/商务礼品网/定制商务礼品/商务福利礼品/商务实用礼品公司推荐
  • egacy(传统) nftables(较新) 和后端ipvs iptables有关系吗
  • 2025 年透声膜厂家最新推荐榜,技术实力与市场口碑深度解析手机防水/MIC 防水/耳机防水/手表防水/摄像头防水/监控防水/无氟防水/ePTFE 防水透声膜公司推荐
  • KlineCharts对接股票k线数据 股票数据源API
  • 2025年抗气爆O形圈厂家权威推荐榜单:橡胶扶正器/V3级胶筒/震击器源头厂家精选
  • 2025年ai智能体推荐公司权威推荐榜单:智能体搜索‌/aigeo‌/AIGEO源头公司精选
  • 右击转到定义,f12会跳转到错误的方法上
  • 2025年企业内部知识库私有化部署服务商全景指南:选型必读——聚焦AI模型与Deepseek方案,贯通知识库与智能BI本地部署的技术演进与厂商矩阵
  • 2025年核心年核心方案商遴选指南:企业智能BI私有化部署厂商与AI知识库(含DeepSeek)部署方案商综合解析
  • 2025企业知识管理破局:AI知识库与智能BI私有化部署实战路径(含知识库部署服务商、AI知识库部署方案商、BI私有化部署方案商全景梳理)
  • [H3C/华三]Super VLAN技术简述与配置
  • 2025年工字钢弯管直销厂家权威推荐榜单:圆管弯管‌/铝型材弯管‌/中频热弯管源头厂家精选
  • 留学中介排名TOP10重磅发布,谁是申请服务标杆