angular语法

news2024/11/28 12:39:00

一、组件内部语法

1.插值语法

{{}}可以看作一小段js执行的部分

将ts声明的变量引入、字符串拼接、三元表达式、简单的数学计算

2.绑定

(1)属性绑定

<div [id]="'box'"></div>

<div [id]="box"></div>会将box看作变量,去ts中寻找变量,如果没声明就会报错

可以绑定id、class、

(2)类绑定:

<h3 [class.xx]="true">类绑定</h3>  

//xx是类名,可以随意写。true可以直接写或者声明变量。

<h3[class]="'xxx yyy'">多个类名绑定</h3>

<h3[class]="{'xxx':true,'yyy':true}"//通过变量动态改变是否渲染

<h3[class]="['xxx','yyy']"></h3> //数组渲染

(3)样式绑定

<h3 [style.color]="'red'></h3>

<h3 [style]="'background:red;color:blue'">多样式绑定1</h3>

<h3 [style]="{'background' :'red','color':'blue'}">

<!-- 也可以结合三目运算符使用 -->

<h3 [style.font-size]="ok?'21px':'10px'">66666</h3>

3.条件判断是否渲染

(1)如果为真就显示

<div *ngIf="ok">条件判断</div>

在ts中定义ok变量

(2)如果为真就显示1,否则显示2(直接输入ngif else回车即可自动生成)

<!-- 需要安装插件 -->

<ng-container *ngIf="ok; else elseTemplate">

    <div>显示1</div>

</ng-container>

<ng-template #elseTemplate>

    <div>显示2</div>

</ng-template>

4.循环

(1)for循环

index表示序列,odd是隐式变量

<div *ngFor="let color of colors let i=index let odd=odd">

    {{odd}}

    {{i}}

    {{color}}

</div>

<!-- ts定义的数组 -->

colors=['red','blue','yellow','green']

(2)switch循环

案例:根据type决定渲染那个

<span [ngSwitch]=type>

<p *ngSwitchCase="1">

type=1

</p>

<p *ngSwitchCase="2">

    type=2

</p>

<p *ngSwitchDefault>

  else

</p>

</span>

<!-- ts声明的type -->

type:number=1;

5.事件绑定/交互

(1)点击事件绑定

<button (click)="clickFun($event)">点击</button>

<!-- event表示事件对象 -->

//在export中写方法

 clickFun(e:Event){

  console.log(e);

 }

 (2)绑定input获取输入的值

 <!-- 可以绑定input事件 -->

 <input type="text" (input)="inputFun($event)">

 inputFun(event: any) //注意类型必须用any

 {

   alert(event.target.value);

 }

 (3)模板引用变量获取输入的值

<!-- 模板引用变量不仅能绑定输入框,还能引用别的html、或者组件 -->

 <input #test type="text">

 <button (click)="getTestValue(test.value)">获取输入的值</button>

 getTestValue(xxx:string){

 alert(xxx);

 }

 (4)数据双向绑定

 <!-- 组件共享值,只对表单元素有效 -->

 <!-- 首先需要在app.module.ts引入 -->

 import { FormsModule } from '@angular/forms';

  <!-- 声明组件需要用到的类 -->

  imports: [

    BrowserModule,

    FormsModule

  ]

<!-- ts声明变量 -->

title:string='';

<!-- ngmodle只对表单有效,减少modle和controller的交互 -->

<input [(ngModel)]="title" type="text">

<p>{{title}}</p>

(5)响应式表单组件

<!-- 在app.module.ts注册响应式表单模块 -->

import { FormsModule ,ReactiveFormsModule} from '@angular/forms';

imports: [

    BrowserModule,

    FormsModule,

    ReactiveFormsModule

  ]

  <!-- 在hello.component.ts导入模块 -->

  import { FormControl } from '@angular/forms';

  //  注册controller实例

age:FormControl=new FormControl();

<!-- 在hello.component.html中使用 -->

<input type="text" [formControl]="age">

<p>年龄{{age.value}}</p>

<!-- 如果想修改 ,只能通过set方法,不能通过等号-->

ageChangeFun(){

  this.age.setValue(18);

}

(5)表单控件分组,例如注册账户需求

<!-- 创建formgroup实例 ,首先引入-->

import { FormControl,FormGroup } from '@angular/forms';

<!-- 声明formgroup实例 -->

loginForm:FormGroup=new FormGroup({

  username:new FormControl(''),

  password:new FormControl('')

});

<!-- html编写分组表单 -->

 <form [formGroup]="loginForm">

   <label>账户

     <input type="text" formControlName="username">

   </label>

   <label>密码

    <input type="text" formControlName="password">

  </label>

 </form>

<!-- 获取输入的值 -->

LoginFun(){

  console.log(this.loginForm.value)

}

6.表单校验

(1)require关键字(必须写)

<!-- 使用ngmodle做的测试 -->

<!-- 首先在ts中声明变量 -->

formData={

  name:'',

  password:''

}

<!-- 通过ngmodle获取表单的值,注意使用ngmodle就必须设置name属性 -->

<form>

    账户:<input required #nameInf="ngModel" type="text" [(ngModel)]="formData.name" name="username">

    <span>{{nameInf.valid}}</span>

    密码:<input required #passwordInf="ngModel" type="text" [(ngModel)]="formData.password" name="password">

    <!-- <span>{{passwordInf.valid}}</span> -->

     <span *ngIf="!nameInf.valid">请输入账户</span>

<button (click)="subFun(nameInf)">提交</button>

</form>

<!-- ts中编写方法,打印组件 -->

subFun(obj:any){

console.log(obj);

}

(2)通过ngmodle跟踪修改状态与有效性验证,根据状态对dom组件绑定状态

已经访问过:ng-touched;没有访问过:ng-untouched

状态修改过:ng-dirty;状态没有修改过:ng-pristine

控件的值有效:ng-valid;控件中没有值:ng-invalid

<!-- 可以根据这个,来对没有输入时,做一些特殊处理 -->

(3)自定义表单验证

<!-- 引入formgroup、formbuilder、validators -->

import { FormControl,FormGroup,FormBuilder,Validators} from '@angular/forms';

<!-- 构造器中注入formbuilder -->

// 注入formbuilder

constructor(private fb:FormBuilder){

}

<!--编写匹配逻辑  -->

valiDataForm=this.fb.group({

    username:["",[Validators.required,Validators.maxLength(10),Validators.minLength(5)]],

    personID:["",[this.PersonIDVali]]

  })

  <!-- 自定义方法 ,正则表达式进行匹配-->

  PersonIDVali(personID:FormControl):object{

   let value=personID.value;

   if(!value){

     return {'msg':"请输入身份证号码"}

   }else{

    const vaild=value.match(/\d{17}[\d|x]|\d{15}/);

    return vaild ? {}:{'msg':"身份证格式不正确"};

   }

  }

  <!-- dom组件 :可以先打印出组件看看结构再输出-->

 <form action="" [formGroup]="valiDataForm">

  <label for="">用户名

    <input type="text" required formControlName="username">

    <p *ngIf="valiDataForm.get('username')?.errors?.['required']">请输入账户</p>

    <p *ngIf="valiDataForm.get('username')?.errors?.['minlength']?.requiredLength">用户名长度不正确</p>

    <p *ngIf="valiDataForm.get('username')?.errors?.['maxlength']?.requiredLength">用户名长度不正确</p>

  </label>

  <label for="">身份证号

    <input type="text" required formControlName="personID">

    <p *ngIf="valiDataForm.get('personID')?.errors">{{valiDataForm.get('personID')?.errors?.['msg']}}</p>

  </label>

  <button (click)="Fun()">提交</button>

 </form>

7.管道

(1)angular内置管道

<!-- 例如大小写字母转换、货币格式转换、日期时间转换 -->

 <p>{{date | date:'yyyy-MM-dd HH:mm:ss'}}</p>

 <p>{{name | uppercase}}</p>

 <p>{{name | lowercase}}</p>

(2)自定义管道

<!-- 执行下面命令,自动创建管道、并且再module.ts文件导入 -->

ng g p 管道名

<!-- 核心在于生成test.pipe.ts中的 transform方法-->

  transform(value: unknown, ...args: unknown[]): unknown {

    return value+"自定义管道";

  }

  <!-- 使用和内置的管道一样 -->

   <p>{{name | test}}</p>

二、组件交互

1.创建组件与介绍

<!-- 创建组件  -->

ng g c home

(1)生命周期

<!-- 关注三个状态:ngOnchanges()、ngOnInit()、ngDocheck() -->

属性值修改、初始化、销毁

(2)父组件给子组件传值(@Input)

<!-- 在父组件引用子组件时 -->

<app-title [title]="title"></app-title>

<!-- 并且需要在父组件的ts声明要传的title值 -->

<!-- 子组件的ts,使用input装饰器,表示可能接收父组件传的值 -->

@Input()

title?:string

<!-- 然后子组件直接使用就可以 -->

(3)子组件给父组件传值(@Output)

<!-- 父组件 -->

<app-title (addList)="addListFun($event)"></app-title>

<!-- 父组件的ts中编写数组和添加元素的函数 -->

list:number[]=[1,2,3]

 addListFun(num:number){

  this.list.push(num);

 }

 <!-- 子组件 通过@output装饰器注册eventemitter-->

 @Output() addList=new EventEmitter();

 <!-- 向EventEmitter对象中添加数据 -->

   PushList(v:string){

    this.addList.emit(v);

   }

   <!-- 这时候子组件调用上面的这个方法就可以向父组件传数据了(类似弹弓弹射的方法) -->

   (4)通过@viewChild获取子组件实例,获取子组件数据

   <!-- 父组件引用子组件时,给子组件打上标记 -->

   <app-title #TitleChild></app-title>

   <!-- 使用@viewchild获取子组件 -->

   @ViewChild('TitleChild') child:any;

   <!-- 这样就可以通过对child+‘.’调用子组件的方法和数据 -->

三、服务

服务是声明数据+数据处理逻辑;组件是展示数据的

ng g s 服务名

ng g s server/list

<!-- 服务需要手动导入 -->

<!-- 在modole.t引入 ,并且在providers中注入-->

import { ListService } from './server/list.service';

providers: [ListService]

<!-- 在服务中声明数据,在ts中使用 -->

private list:Array<string>;

constructor() {

  this.list=['JAVA','GO','PYTHON'];

}

<!-- 可以提供一些get、set方法 -->

 public getlist(){

    return this.list;

  }

  addNode(str:string){

    this.list.push(str);

  }

  <!-- 在组件中使用 -->

  <!-- 在component.ts导入,并且在构造器中注入 -->

import { ListService } from './../server/list.service';

constructor(listService:ListService){}

<!-- 通过listService+'.'就可以使用了 -->

四、路由

(1)基础配置

根据url的变化,决定组件的展示

<!-- 执行下面的语句,创建路由配置文件 -->

ng generate module app-routing --flat --module=app

<!-- 在app-routing.module.ts引入组件 -->

import {HomeComponent} from "./home/home.component";

import { HelloComponent } from './hello/hello.component';

import { RouterModule,Routes } from '@angular/router';

<!--设置路由路径对应的组件,路径为空表示上来默认访问的页面  -->

const routes:Routes=[

{

  path:'home',

  component:HomeComponent

},

{

  path:'hello',

  component:HelloComponent

}

]

<!-- 说明当前是路由渲染的位置 -->

@NgModule({

  declarations: [],

  imports: [

    CommonModule,

    RouterModule.forRoot(routes)

  ],

  exports:[RouterModule]

})

<!--routerLink跳转的路由,routerLinkActive跳转成功绑定的类  -->

 <a routerLink="/hello" routerLinkActive="hello">你好</a>

 <a routerLink="/home">主页面</a>

 <!-- 渲染绑定路由组件的地方 -->

 <router-outlet></router-outlet>

 (2)路由补充

 <!-- 通配符 -->

 path:'**',

 component:404的component

 (3)路由嵌套

 <!-- 配置children属性 -->

 const routes:Routes=[

{

  path:'home',

  component:HomeComponent,

  children:[

    {

    path:'list',

    component:ListComponent

    }

  ]

}

<!-- 在父路由页面写routerLink和router-outlet-->

<a routerLink="/home/list">跳转到list</a>

<router-outlet></router-outlet>

(4)路由传参

方法一:query方法:使用?拼接

 <a routerLink="/hello" [queryParams]="{name:3}">你好</a>

 <!-- 通过这种方式获取的值,ts怎么获取? -->

 <!-- 构造器注册ActivatedRoute对象 -->

 constructor(private routerinfo:ActivatedRoute){}

 <!--自动导入 -->

 import { ActivatedRoute } from '@angular/router';

 <!-- 可以在生命周期函数上进行测试 -->

  ngOnInit(): void {

   console.log(this.routerinfo.snapshot.queryParams)

   <!-- 这是一种常用的获取参数的方式 -->

  }

方法二:params方法:使用/拼接

<!-- 在rout文件中拼接参数 -->

{

  path:'hello/:id',

  component:HelloComponent

}

<!--将参数直接加在routerLink后面  -->

 <a [routerLink]="['/hello','111']" [queryParams]="{name:3}">你好</a>

 <!-- ts中获取传递的值 -->

 id:string='';

  ngOnInit(): void {

  //  console.log(this.routerinfo.snapshot.queryParams)

   this.routerinfo.params.subscribe((params:Params)=>{

    this.id=params['id']

   })

   console.log(this.id);

  }

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

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

相关文章

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

【NOIP普及组】表达式求值

【NOIP普及组】表达式求值 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值。 输入 输入仅有一行&#xff0c;为需要你计算的…

“蜀道山”高校联合公益赛 Web (部分)

文章目录 奶龙牌WAF海关警察训练平台恶意代码检测器 奶龙牌WAF <?php if ($_SERVER[REQUEST_METHOD] POST && isset($_FILES[upload_file])) {$file $_FILES[upload_file];if ($file[error] UPLOAD_ERR_OK) {$name isset($_GET[name]) ? $_GET[name] : basen…

鸿蒙中的Image组件如何引用网络图片

1.引用网络图片资源 引入网络图片需要申请权限ohos.permission.INTERNET&#xff0c;此时&#xff0c;Image组件的src参数为网络图片的链接&#xff0c;为了成功加载网络图片&#xff0c;您需要在module.json5文件中申请网络访问权限 注意&#xff1a;实际可用的时候&#xff0…

问题记录-Java后端

问题记录 目录 问题记录1.多数据源使用事务注意事项&#xff1f;2.mybatis执行MySQL的存储过程&#xff1f;3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项&#xff1f; 问题&#xff1a;在springBoot项目中多表处理数…

PySide6 QSS(Qt Style Sheets) Reference: PySide6 QSS参考指南

Qt官网参考资料&#xff1a; QSS介绍&#xff1a; Styling the Widgets Application - Qt for Pythonhttps://doc.qt.io/qtforpython-6/tutorials/basictutorial/widgetstyling.html#tutorial-widgetstyling QSS 参考手册&#xff1a; Qt Style Sheets Reference | Qt Widge…

vue3 开发利器——unplugin-auto-import

这玩意儿是干啥的&#xff1f; 还记得 Vue 3 的组合式 API 语法吗&#xff1f;如果有印象&#xff0c;那你肯定对以下代码有着刻入 DNA 般的熟悉&#xff1a; 刚开始写觉得没什么&#xff0c;但是后来渐渐发现&#xff0c;这玩意儿几乎每个页面都有啊&#xff01; 每次都要写…

搭建AI知识库:打造坚实的团队知识堡垒

在信息爆炸的时代&#xff0c;企业面临着知识管理的挑战。团队知识堡垒的构建&#xff0c;即搭建一个高效的AI知识库&#xff0c;对于保护和利用知识资产、提升团队协作效率和创新能力至关重要。本文将探讨搭建AI知识库的重要性、策略以及如何通过这一系统打造坚实的团队知识堡…

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…

《Shader入门精要》透明效果

代码以及实例图可以看github &#xff1a;zaizai77/Shader-Learn: 实现一些书里讲到的shader 在实时渲染中要实现透明效果&#xff0c;通常会在渲染模型时控制它的透明通道&#xff08;Alpha Channel&#xff09;​。当开启透明混合后&#xff0c;当一个物体被渲染到屏幕上时&…

Exploring Prompt Engineering: A Systematic Review with SWOT Analysis

文章目录 题目摘要简介方法论背景相关工作评估结论 题目 探索快速工程&#xff1a;基于 SWOT 分析的系统评价 论文地址&#xff1a; https://arxiv.org/abs/2410.12843 摘要 在本文中&#xff0c;我们对大型语言模型 (LLM) 领域的提示工程技术进行了全面的 SWOT 分析。我们强…

LLM-pruner源码解析

1.超参数 模型剪枝的超参数 模型 模型检查点和日志的保存地址 剪枝比例&#xff0c;这里默认0.5 剪枝类型&#xff0c;这里模型L2 模型生成时的超参数 温度 top_p 最大序列长度 逐通道&#xff0c;逐块&#xff0c;逐层&#xff0c;这个逐层我不记得在论文里面提过啊 layer…

Stable Diffusion 3详解

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

零基础学安全--shell(8)脚本相互利用

目录 学习连接 脚本相互利用 脚本利用 利用脚本中的变量 重定向 输出重定向 错误输出 输入重定向 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探…

图书系统小案例

目前就实现了分页查询&#xff0c;修改&#xff0c;删除功能 这个小案例练习到了很多技能&#xff0c;比如前后端交互、异步请求、三层架构思想、后端连接数据库、配置文件、基础业务crud等等 感兴趣的小伙伴可以去做一个试试 准备工作 1、使用maven构建一个web工程 打开i…

深度理解进程的概念(Linux)

目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; 视频图片生成器 一个基于 Python 和 Web 的工具&#xff0c;用于生成带有文字和语音的视频以及图片。支持多种尺寸、…

STM32的一些知识技巧

STM32的一些知识技巧 STM32命名规则 查看代码编译所占用的flash和SRAM的大小 单位为字节&#xff08;Byte&#xff09; 1、使用keil编译结果进行计算 2、查看.map文件 STM32启动模式 主闪存启动地址为0x08000000 查看程序段/函数执行时间 global.prop文件 保存字体配置&…

我们来学mysql -- EXPLAIN之rows(原理篇)

EXPLAIN之rows 题记rows 题记 书接上文《 EXPLAIN之ref》2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化器&…

【AI系统】昇腾 AI 核心单元

昇腾 AI 核心单元 本文将深入介绍昇腾 AI 处理器的核心单元——AI Core&#xff0c;以及其背后的达芬奇架构。昇腾 AI 处理器是华为针对 AI 领域设计的专用处理器&#xff0c;其核心 AI Core 采用了特定域架构&#xff08;Domain Specific Architecture&#xff0c;DSA&#x…