Angular - 笔记

文章目录

语法

属性绑定

Angular 的双向绑定语法是方括号和圆括号的组合 [()][] 进行属性绑定,() 进行事件绑定。

1. 语法
// 在属性上用{{}}
<p title="{{title}}">

// 使用[]做属性绑定 
<p [title]="title">
    
举例:
//html文件
    <p>属性绑定</p>
    <div [id]="'apple'">Apple</div>
    <div [id]="lemon">{{lemon}}</div>
    <div id="{{lemon}}">{{lemon}}</div>
    
    <div [class]="'item'">绑定Class - 1</div>
    <div [class]="itemClass">绑定Class - 2</div>

    <h3 [class.h3-dom]="h3Dome">class.h3-dom根据true决定是否显示</h3>
    <h3 [class.h3-dom]="'true'">class.h3-dom根据true决定是否显示</h3>  // 也可以渲染成功

    <h3 [class]="'h3-dom font w string'">多类名绑定</h3>
    <a [title]="product.name + ' details'">  {{ product.name }} </a>

// ts文件
  lemon : string = 'lemon'
  itemClass : string ='item-Class';
  h3Dome : boolean = true;
  product = {name: '张三'};
  1. ngMoudle
// home.html eg: 1
    <input [(ngModel)]="name" #ctrl="ngModel" required>

    <p>Value: {{ name }}</p>  <!--111-->
    <p>Value: {{ ctrl.value }}</p> <!--111-->
    <p>Valid: {{ ctrl.valid }}</p> <!--true-->
// home.html eg: 2
    <label for="example-ngModel">[(ngModel)]:</label>
    <input [(ngModel)]="currentItem.name" id="example-ngModel"> 
// home.ts
    export class HomePage {
      currentItem = {name: '张三'};
    }
// home.html   eg: 3 - ngForm中使用 ngModel
    <div>
        <form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
            <input name="first" ngModel required #first="ngModel">
            <br>
            <input name="last" ngModel>
            <br>
            <button>Submit</button>
        </form>

        <p>First name value: {{ first.value }}</p>
        <p>First name valid: {{ first.valid }}</p>
        <p>Form value: {{ f.value | json }}</p>
        <p>Form valid: {{ f.valid }}</p>
    </div>

引用模板变量

  1. 语法:在模板中,要使用井号 # 来声明一个模板变量。下列模板变量 #phone 声明了一个名为 phone 的变量,其值为此 <input> 元素。
<input #phone placeholder="phone number" />

<!--可以在组件模板中的任何地方引用某个模板变量。这里的 <button> 就引用了 phone 变量-->
utton type="button" (click)="callPhone(phone.value)">Call</button>

// eg:1 这个是input自带value属性,{{phone.value}}会呈现test,更改input值不会有改变,因为没写ngMoudle进行双向绑定
<input #phone placeholder="phone number" value="text" />
<p>Value: {{ phone.value }}</p>

// eg:2 双向数据绑定
<input #phone type="text" id="name" class="form-control" name="name" ngModel required />
{{phone.value}}

组件绑定

父组件传子组件 @input

现在有父组件<parentlist> 和子组件<childlist>

  1. 配置子组件
//userlist.ts
import { Component, Input } from '@angular/core'; // First, import Input
export class ChildComponent {
  @Input() item = ''; // decorate the property with @Input()
}
// userlist.html
Userlist组件:Today's item: {{item}}
  1. 配置父组件
//parentlist.ts
export class ParentComponent { // 业务逻辑
  currentItem = 'Television';
}
// parentlist.html
<parentlist [item]="currentItem"></parentlist>

运行结果如下,这样就实现了父组件的 currentItem 变量绑定给了子组件的 item
在这里插入图片描述

子组件传父组件 @output
  1. 子组件
// 1. html 
    <label for="item-input">Add an item:</label>
    <input type="text" id="item-input" #newItem>
    <button ion-button  (click)="addNewItem(newItem.value)">Add</button>

// 2. ts
import { Output, EventEmitter } from '@angular/core';

export class ChildComponent {
  @Output() newItemEvent = new EventEmitter<string>();
  
  addNewItem(value: string) {
    // value = "测试value";
    this.newItemEvent.emit(value);
    console.log("----"+value);
  }
}
  1. 父组件
// 1. html
    <child (newItemEvent)="addItem($event)"></child>
    <ul>
        <li *ngFor="let item of items">{{item}}</li>
    </ul>

// 2. ts
export class ParentComponent {
  items = ['item1', 'item2', 'item3', 'item4'];
  
  addItem(newItem: string) {
    this.items.push(newItem);
    console.log(newItem);
  }
}

上述可以这么理解:

  1. 当触发子组件的 addNewItem() 函数时,页面数据双向绑定去拿到一个值给到 newItemEvent
  2. 父组件根据 @outpiy newItemEvent 拿到的值,即作为参数 event ,去执行 addItem 函数给到 items ,然后页面输出。
    在这里插入图片描述
EventEmitter

Angular 提供了一个 EventEmitter 类,它用来通过组件的 @Output() 装饰器 发送一些值。EventEmitter 扩展了 RxJS Subject,并添加了一个 emit() 方法,这样它就可以发送任意值了。当你调用 emit() 时,就会把所发送的值传给订阅上来的观察者的 next() 方法。
 
EventEmitter 与指令@Output 一起在组件中使用以同步或异步方式发送自定义事件,并通过订阅实例来注册这些事件的处理程序。

EventEmitter语法:
emit() : 发出包含给定值的事件。
subscribe(): 注册此实例发出的事件的处理器
  1. 子组件
// 1.html
    <div class="zippy">
        <div (click)="toggle()">点击该文本</div>
        <div [hidden]="visible">
            <ng-content></ng-content>
        </div>
    </div> 

// 2.ts
export class ChildComponent {
  visible = true;
  // tslint:disable-next-line: no-output-native
  @Output() open = new EventEmitter<any>();
  // tslint:disable-next-line: no-output-native
  @Output() close = new EventEmitter<any>();
  
  toggle() {
    this.visible = !this.visible;
    if (this.visible) {
      this.close.emit('关闭');
    } else {
      this.open.emit('打开');
      this.open.subscribe((data) => {
        console.log('open subscribe:' + data);
      });
    }
  }
}
  1. 父组件: 子组件去运行 toggle()函数去赋值给 open 或者 close,父组件根据拿到的值去运行onOpen()或者onClose语句。
// 1.html
    <child (open)="onOpen($event)" (close)="onClose($event)">我是child组件的内容</child>

// 2. ts
export class ParentComponent {
  onOpen(e) {
    console.log(e);
  }
  onClose(e) {
    console.log(e);
  }
}

@ViewChild

@ViewChild 可以获取到当前组件视图中的单个元素

@ViewChild('selector', {read: ElementRef, static: false})  selector; 
1. selector - 要查询的指令类型或名称。
2. read - 用于从查询到的元素中读取不同的令牌。
3. static - 如果为 true,则在变更检测运行之前解析查询结果,如果为 false,则在变更检测之后解析。默认为 false// eg:1
字符串形式的模板引用变量(比如可以使用 @ViewChild('cmp') 来查询 <my-component #cmp></my-component>
里面的cmp就是模板应用变量

// eg:2 
我想通过#myname去查询原始,并将返回ViewContainerRef类型
@ViewChild('myname', {read: ViewContainerRef}) target; 

例子如下:

// 1.home.html
    <p #myLabel>icon</p>
// 2. home.ts
export class HomePage {
  @ViewChild('myLabel') temp;
  ngAfterViewInit(): void {
    console.log(this.temp);} // ElementRef {nativeElement: p}
}
@ViewChildren获取子组件对象列表

管道

PIPE,翻译为管道。Angular 管道是编写可以在HTML组件中声明的显示值转换的方法。Angular 管道之前在 AngularJS 中被称为过滤器,从 Angular 2 开始就被称为管道。管道将数据作为输入并将其转换为所需的输出。
 
简单来说,就是 Angular Pipes 可以帮我们把我们的输入,包括字符串,整数和日期等等,按照我们的需要转化为特定的格式并且在浏览器中显示。通过插值表达式,我们可以定义管道并且在特定的情况下使用它,在 Angular 中提供给了我们许多种不同类型的管道,当然,你甚至还可以去自定义管道。
 
更多管道官当网址
 
总结:管道就是一个方法,可以将你的输入转化为特定的你需要的输出格式,Angular提供给了我们许多的内置管道,当内置管道不满足你的要求的时候,你还可以通过自定义管道来更加灵活的自定义输出格式。

1.时间管道

// 1. html 
    {{date }}  // Mon Jan 08 2024 09:41:10 GMT+0800 (中国标准时间)
    <br> 
    {{date | date:'yyyy-MM-dd'}} //  2024-01-08

// 2. ts
export class HomePage {
  date = new Date();
}
  1. 货币管道
// 1.html
    <p>A: {{a | currency}}</p>  <!-- A: $0.26 -->
    <p>A: {{a | currency:'CAD'}}</p> <!-- A: CA$0.26 -->
    <p>A: {{a | currency:'CAD':'code'}}</p> <!-- B: CA$0,001.35 -->
    <p>B: {{b | currency:'CAD':'symbol':'4.2-2'}}</p> <!-- B: CA$0,001.35 -->
    <p>B: {{b | currency:'CAD':'symbol-narrow':'4.2-2'}}</p> <!-- B: $0,001.35 -->
    <p>B: {{b | currency:'CLP'}}</p> <!-- B: CLP1.35 -->

// 2.ts
export class HomePage {
  a: number = 0.259;
  b: number = 1.3495;
}
  1. 自定义管道
// 1. 创建指令
ng g p pipes/pipe-name
// ionic
ionic g + pipe + name

// 2. app.module.ts配置(本次的例子是基于ionic3框架)
import {PipesModule} from '../pipes/pipes.module';
  imports: [ 
    PipesModule,
    IonicModule.forRoot(MyApp)
  ],
// 3. pipes/test/test/ts
@Pipe({
  name: 'test', // 这个name用于下面html的管道名称
})
export class TestPipe implements PipeTransform {
  transform(value: string, ...args) {
    let value1 = "test"+value;
    return value1;
  }
}

// pages/home.html
{{lemon | test}}

常用模块

Angular 应用至少需要一个充当根模块使用的模块。 如果你要把某些特性添加到应用中,可以通过添加模块来实现。

参考文档

[1] W3CSchool
[2] 官网 - 父子组件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

x-cmd pkg | grex - 用于生成正则表达的命令行工具

目录 简介首次用户生成的正则表达式与 perl 和 rust 兼容支持 Unicode 符号友好的用户体验进一步阅读 简介 grex 是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是 Devon Govett 编写的 JavaScript 工具 regexgen 的 Rust 移植。但 regexgen 在…

RT-Thread基于AT32单片机的CAN应用

1 硬件电路 2 RT-Thread驱动配置 RT-Studio中没有CAN相关的图形配置&#xff0c;需要手动修改board.h。在board.h的末尾&#xff0c;增加相关的BSP配置。 #define RT_CAN_USING_HDR #define BSP_USING_CAN13 IO配置 at32_msp.c中的IO配置是PB9和PB10&#xff0c;掌上实验室V…

松鼠目标检测数据集VOC格式400张

松鼠&#xff0c;一种小巧玲珑、活泼可爱的啮齿类动物&#xff0c;以其蓬松的大尾巴和机敏的动作而广受欢迎。 松鼠通常体型小巧&#xff0c;四肢灵活&#xff0c;尾巴蓬松。它们的耳朵大而直立&#xff0c;眼睛明亮&#xff0c;给人留下了深刻的印象。松鼠的毛色因种类而异&a…

OLED显示模块的驱动和使用方法(附资料分享)

一、引言 本文旨在分享单片机对OLED显示模块的驱动方法和驱动代码。与此同时&#xff0c;本文还会分享如何使用取模软件进行取模&#xff0c;包括汉字取模、图片取模、英文取模。文末附驱动的代码工程和模块资料链接。 二、模块概述 1、OLED显示屏模块 2、引脚定义 3、原理图 …

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…

pycharm的使用技巧

1.新建文件时,自动生成代码 settings->editor->file and code templates,选择python script ${NAME} 文件名 ${DATE} 日期 2.自动补齐自定义段落 settings->editor->live templates,在右侧点击+号,添加自定义的内容 完成之后,在下方勾选python 3.修改注释的…

「实用分享」如何用Telerik UI组件创建可扩展的企业级WPF应用?

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

Android逆向学习(六)绕过app签名校验,通过frida,io重定向(上)

Android逆向学习&#xff08;六&#xff09;绕过app签名校验&#xff0c;通过frida&#xff0c;io重定向&#xff08;上&#xff09; 一、写在前面 这是吾爱破解正己大大教程的第五个作业&#xff0c;然后我的系统还是ubuntu&#xff0c;建议先看一下上一个博客&#xff0c;关…

强化学习求解TSP(二):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

Linux【C编程】 信号以及信号的处理方式

文章目录 1.什么是信号&#xff1f;1.1信号是内容受限的一种异步通信机制1.2信号由谁发出的&#xff1f;1.3信号由谁处理&#xff0c;如何处理 2.常见的信号3.进程对信号的处理3.1用signal函数处理SIGINT信号3.2使用sigaction 函数 4.alarm 和pause函数4.1 alarm函数详解4.2 pa…

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中&#xff0c;发现很多存储在oss的静态资源&#xff08;图片&#xff0c;安装包&#xff09;的链接中域名都使用了cdn域名&#xff0c;后面了解到这个cdn域名的主要作用是加速资源的访问&#xff0c;于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…

CCSC,一种CPU架构

core-circuit-separate-computer 核与执行电路的分离&#xff0c;最初是为了省电。 用寄存器实现这种分离。 V寄存器控制着执行电路的供电&#xff0c;V0则不供电&#xff0c;进入省电模式&#xff1b;V1则供电&#xff0c;进入工作模式。 P寄存器是parameter-register&#xf…

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…

【leetcode 2707. 字符串中的额外字符】动态规划 字典树

2707. 字符串中的额外字符 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割…

Developer Tools for Game Creator 1

插件包含: 持久世界时间管理系统 单击以生成对象或预设 游戏内调试控制台 游戏内事件控制台 控制台管理控制 命令模板脚本 游戏内屏幕截图 低分辨率和高分辨率图像 缩略图生成 移动支持 使用Game Creator Action或拖放来激活和控制组件,无需编码。 通过此资产,您可以获得: …

ESP32_ADC(Arduino)

ADC模数转换 ESP32集成了12位的逐次逼近式ADC&#xff0c;分别为ADC1模块ADC2模块&#xff0c;共支持18个模拟输入通道: ADC1模块&#xff1a;8个通道&#xff0c;32~39ADC2模块&#xff1a;10个通道&#xff0c;0&#xff0c;2&#xff0c;4&#xff0c;12 ~ 15&#xff0c;…

Linux网络配置概述

目录 一.查看网络配置 1.ifconfig 2.ip a 3.hostname 4.route 5.netstat和ss &#xff08;1&#xff09;netstat &#xff08;2&#xff09;ss &#xff08;3&#xff09;区别 6.ping 7.traceroute 8.nslookup 9.dig 二.网卡配置 三.域名解析配置文件 1.文件所…

用React给XXL-JOB开发一个新皮肤(一):环境搭建和项目初始化

目录 一. 简述二. Fork 项目三. 搭建开发环境四. 初始化皮肤项目五. 添加相关依赖六. 预览 一. 简述 大名鼎鼎的 xxl-job 任务调度中心我们应该都使用过&#xff0c;项目地址&#xff1a;xxl-job。它是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单…

【MySQL】导出导入(两种方式),远程备份

目录 前言&#xff1a; 一 navcat导入导出 1.1 导入 1.2 导出 二 mysqldump 导入导出 2.1 导入 2.2 导出 三 load data infile命令导入导出 3.1 导入 3.2 导出 四 远程备份 五 思维导图 前言&#xff1a; 随着当今企业发展&#xff0c;数据库的数据越来越多&…

vulhub中的Nginx漏洞的详细解析

Nginx漏洞 1.cd到nginx_parsing_vulnerability cd /opt/vulhub/nginx/nginx_parsing_vulnerability 2.执行docker-compose up -d 3.查看靶场是否开启成功 dooker ps 4.访问浏览器 因为这里是80端口所以直接使用ip就能访问成功 5.上传图片 注意这里的图片是含有一句话木马的图…