Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期

本篇文章给大家分享angular的一些知识点,介绍一下angular的两表单(模板驱动表单和响应式表单)、三管道(内置管道、链式管道、自定义管道)、三绑定、三指令、五通信、八周期,希望对大家有所帮助!

Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期

1 Angular的两大表单

1.1 模板驱动表单

? 模板驱动表单:引入FormsModule模块,表单的控制逻辑都是写在模板里的,每一个表单元素都是和一个负责管理内部表单模型的指令关联起来的。【相关教程推荐:《angular教程》】

import { Component, OnInit } from '@angular/core';import { NgForm } from '@angular/forms';@Component({  selector: 'app-module-form',  template:`                  `,  styleUrls: ['./module-form.component.less']})export class ModuleFormComponent implements OnInit {  constructor() { }  ngOnInit() {  }  OnSubmit(moduleForm:NgForm){    console.log(moduleForm.value);  }}

1.2 响应式表单

? 响应式表单:需要引入ReactiveFormsModule模块,在响应式表单中,视图中的每个表单元素都直接链接到一个表单模型。

FormControl:是构成表单的基本单位。实例用于追踪单个表单控件的值和验证状态FormGroup:用于追踪一个表单控件组的值和状态。FormGroup和FormArray的区别:formgroup既可以代表表单一部分也可以代表整个表单;formarray有一个额外的长度属性,它的formControl是没有相关的key的,只能通过访问formarray中的元素。

//原始的定义方法export class ReactiveRegistComponent implements OnInit {  formModel:FormGroup;  constructor() {    this.formModel=new FormGroup({      username:new FormControl(),      mobile:new FormControl(),      passwordsGroup: new FormGroup({        password:new FormControl(),        pconfirm:new FormControl(),      })    });  }}//使用formBuilder后的定义constructor(fb:FormBuilder) {  this.formModel=fb.group({    username:[''],    mobile:[''],    passwordsGroup: fb.group({      password:[''],      pconfirm:[''],    })  });}
import { Component, OnInit } from '@angular/core';import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms';@Component({  selector: 'app-module-form',  // templateUrl: './module-form.component.html',  template:`                `,  styleUrls: ['./module-form.component.less']})export class ModuleFormComponent implements OnInit {  form!: FormGroup;  constructor(private fb: FormBuilder) { }  ngOnInit() {    this.form = this.fb.group({      username:[null,[Validators.required,Validators.maxLength(6)]],      password:[null,[Validators.required]],    })  }}

自定义验证器:

export function whiteSpaceValidator(): ValidatorFn {  // 不能全输入空格,验证  return (control: FormControl): { [s: string]: boolean } => {    const reg = new RegExp(/s/g);    if (reg.test(control.value)) {      return { required: true };    }  };}

2 Angular管道

管道:把数据作为输入,然后转换它并给出输出。

2.1 内置管道

? Angular的一些内置管道:如date、uppercase、lowercase、currency、percent等,不用引入,直接在任何组件中使用。注意:用date转化的数据不能为字符串,必须为Date类数据

当前时间日期为{{curDate|date}}

当前时间日期为{{curDate|date:"yyyy/MM/dd"}}

转大写{{title|uppercase}}

转小写{{title|lowercase}}

转换金额字符串{{0.259|currency}}

转换金额百分比{{0.259|percent}}

2.2 链式管道

? 链式管道:管道以多个条件指定格式输出。

当前时间日期为{{curDate|date:'fullDate'|lowercase}}

2.3 自定义管道

? 自定义管道:在app.module文件的declarations中进行声明就可以在任何一个组件中使用了。

600000毫秒真实时间:{{600000|TimeFormater}}

import { PipeTransform, Pipe } from '@angular/core';@Pipe({  name: 'TimeFormater',})export class TimeFormaterPipe implements PipeTransform {// // 传入的是一个一毫秒为单位的时间数  transform(value) {    if (!value || value <= 0) {      return '00天00时00分00秒';    }    const time = Math.abs(value);    const transecond = Math.round(time / 1000); // 转化为秒    const day = Math.floor(transecond / 3600 / 24); // 获取天数    const hour = Math.floor((transecond / 3600) % 24); // 获取小时,取余代表不满一天那部分    const minute = Math.floor((transecond / 60) % 60); // 获取分,取余代表不满小时那部分    const second = transecond % 60;    return `${this.formatTime(day)}天${this.formatTime(hour)}时${this.formatTime(minute)}分${this.formatTime(second)}秒`;  }  formatTime(t) {    return t < 10 ? '0' + t : '' + t;  }}

3 Angular的三大绑定

3.1属性绑定

? 属性绑定的属性指的是元素、组件、指令的属性。属性的绑定是单向绑定,从组件的属性流动到目标元素的属性。

3.2 attribute、class和style绑定

?attribute绑定:并非所有属性都有可供属性绑定。是HTML标签上的特性,它的值只能够是字符串。通过attr.特性名绑定。而比如标签中的id、src等这些属于Property(属性,DOM中的属性,是JavaScript里的对象),这些可以直接绑定就可。而attribute绑定如下:

One-Two
FiveSix

?class的绑定:静态绑定、单一属性动态绑定方式、多属性动态绑定方式、ngCLass指令绑定。

  .test1{    width: 100px;    height: 100px;    border: 1px solid;  }  .test2{    width: 100px;    height: 100px;    background-color: yellowgreen;  }

(1)静态绑定:可以是一个,也可以是多个,多个的class就会融合起来。

(2)单一属性动态绑定方式:取在css文件中定义好的样式进行绑定,class.样式的class名

(3)多属性动态绑定方式:class的绑定

moreClass:object = {    'test1':true,    'test2':true}

?style的绑定:单一样式绑定、带单位的单一样式绑定、多个样式绑定。(1)单一样式的绑定

(2)带单位的单一样式绑定

(3)多个样式绑定

`
绑定多个形式的style

`
moreStyle:string =  'width: 100px;height: 200px';

3.3 事件绑定

?事件绑定:带()的特性就是事件绑定。括号内代表的是目标事件。而下面例子的事件绑定就是点击事件的绑定。

(1)目标事件是原生DOM元素事件,input是DOM元素input的原生事件。

//html//jscurrentUser={    'name':''}getValue(ev:any){    this.currentUser.name = ev.target.value;    console.log(this.currentUser.name);}

(2)目标事件是指令:比如ngClickngDblclick等。

(3)目标事件是自定义事件。目标事件 (子组件的EventEmitter实例变量)=”父组件的方法(子组件数据)” 下文的父子组件通信已经有详解?。

4 Angular的三大指令

4.1 属性型指令

? 属性型指令:该指令可改变元素、组件或其他指令的外观和行为。比如:

ngClass指令:可以通过动态地添加或移除css类来控制css来如何显示。ngStyle指令:可以同时设置多个内联样式。ngModel指令:可以双向绑定到HTML表单中的元素。创建属性型指令:在app.module文件中的declarations数组中进行声明就可以在任何组件的标签元素中调用,如下:

看一下指令

// Directive:在declarationsimport { Directive, ElementRef } from '@angular/core';@Directive({  selector: '[appHighlight]'})export class HighlightDirective {  constructor(el:ElementRef) {    el.nativeElement.style.backgroundColor = 'yellow';  }}
import { Directive, ElementRef, HostListener } from '@angular/core';@Directive({  selector: '[appHighlight]'})export class HighlightDirective {  constructor(private el:ElementRef) {  }    // 监听鼠标悬浮背景颜色设置  @HostListener('mouseenter') onMouseEnter(){    this.hightlight('yellow');  }  // 监听鼠标离开背景颜色设置  @HostListener('mouseleave') onMouseLeave(){    this.hightlight('');  }  private hightlight(color:string){    this.el.nativeElement.style.backgroundColor = color;  }}

4.2 结构型指令

? 结构型指令:该指令通过添加或移除DOM元素来改变DOM布局。每一个宿主元素都只能有一个结构型指令。比如ngif和ngfor不能在同一元素出现。如ngif、ngfor、ngSwitch(本身是属性型指令,它控制了两个结构型指令ngSwitchCase和ngSwitchDefault),结构型指令一般都是带***符号的**。

自定义结构型指令:

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';@Directive({  selector: '[appTagdisplay]'})export class TagdisplayDirective {  private hasView = false;  // ViewContainerRef访问视图容器  constructor(private templateRef:TemplateRef,private viewContainer:ViewContainerRef) { }  @Input() set appTagdisplay(condition:boolean){    if(!condition&&!this.hasView){      // 视图容器创建一个内嵌的视图      this.viewContainer.createEmbeddedView(this.templateRef);      this.hasView = true;    }else if(condition&&this.hasView){      // 清除该容器,销毁该视图      this.viewContainer.clear();      this.hasView = false;    }  }}

自定义结构指令

该段显示,因为appTagdisplay为false

该段不显示,因为appTagdisplay为true

4.3 组件

? 组件:也是一种指令,该指令拥有模板。

5 Angular的五大组件通信

5.1 Input与Output实现父子组件通信

通过下面的例子我们会发现Input和Output的操作都在子组件中。父传子:在父组件中动态绑定属性,在子组件中Input获取父组件传来的属性。子传父:子组件创建一个实例化EventEmitter对象,EventEmitter 的核心就是事件触发与事件监听器功能的封装;父组件:通过事件绑定调用带参自定义函数接受子组件传来的数据(自定义函数的参数)。

? 父组件:双向绑定fatherData也就是当前输入框输入的信息,点击发送事件触发传给子组件的currentData添加数据并清空当前输入框的信息。

{{item}}
import { Component, OnInit } from '@angular/core';export class FatherComponent implements OnInit {  isClear:boolean=false;  fatherData:any;  currentData:Array=[];  constructor() { }  ngOnInit() {    this.fatherData = this.currentData;  }  send(){    this.currentData.push("我是父组件的数据:"+this.fatherData);    this.fatherData='';  }  getSonInfo(event:any){    this.currentData.push("我是子组件的数据:"+event);  }}

? 子组件:输入框输入sonData,点击发送事件触发子组件事件发射数据,然后父组件就可以通过子组件绑定的事件发射从父组件通过事件方法获取当前子组件发送的数据。

{{item}}
import {  OnInit } from '@angular/core';export class SonComponent implements OnInit{  @Input() dataSource:any=0;  @Output() sonSend = new EventEmitter();  isClear:boolean=false;  sonData:any;  currentData:Array=[];  constructor() { }  ngOnInit(): void {    this.currentData = this.dataSource;  }  send(){    this.sonSend.emit(this.sonData);    // this.currentData.push("我是子组件的数据:"+this.sonData);    this.sonData='';  }}

1.png

5.2 通过本地变量实现父子组件的通信

在父组件的模板中创建一个代表子组件的本地变量,通过调用这个变量就可以调用子组件中的属性和方法。

我是父组件
子组件:{{sonTpl.myName}}

5.3 通过@ViewChild实现父子组件的通信

父组件的js中定义@ViewChild(SonComponent) childTpl: any;,注意在html必须要调用子组件元素,不然会直接报错,且不能直接调用childTpl.myName获取子组件中的变量。

我是父组件
// 子组件中的getName getName(){    console.log('我是子组件的getName方法'); }

5.4 通过共享服务Service实现非父子组件通信

栗子来自书籍《Angular企业级应用开发实战》-p143:

知我AI 知我AI

一款多端AI知识助理,通过一键生成播客/视频/文档/网页文章摘要、思维导图,提高个人知识获取效率;自动存储知识,通过与知识库聊天,提高知识利用效率。

知我AI 26 查看详情 知我AI

2.png

? Service服务:主要控制准备开始、和确认按钮的动作进行消息的传递。注意这个服务的定义一定是共享的,不要在各个组件下独自注入providers中,因为单独引入service只是在当前组件有效,每个组件调用一次都是独立的,互不影响,这就不是组件通信需要的。

import { Injectable } from '@angular/core';import { Subject } from 'rxjs';@Injectable({  providedIn: 'root'})export class MissionService {  // 源  private missionAnnounceSource = new Subject();  private misssionConfirmedSource = new Subject();  // 流  // asObservable:可观察的序列,隐藏源序列的身份。  missionAnnounce$ = this.missionAnnounceSource.asObservable();  missionConfirm$ = this.misssionConfirmedSource.asObservable();  constructor() {}  announceMission(mission:string){    this.missionAnnounceSource.next(mission);  }  confirmMission(astronaut:string){    this.misssionConfirmedSource.next(astronaut);  }}

? MissioncontrolComponent:这是一个主要界面的组件,在界面中调用了astronaut组件。当前组件就是父组件,而astronaut组件就是一个子组件。

import { Component, OnInit } from '@angular/core';import { MissionService } from 'src/app/service/mission.service';@Component({  selector: 'app-missioncontrol',  template: `

导弹控制器

日志

  • {{event}}
`,})export class MissioncontrolComponent implements OnInit { astronauts = ['操作员1','操作员2','操作员3']; history:string[] = []; missions = ['发射导弹']; nextMession = 0; constructor(private misssionSvc:MissionService) { // 获取子组件保存的信息,获取是哪一个操作员点击确认了 misssionSvc.missionConfirm$.subscribe((astronaut)=>{ this.history.push(`${astronaut}已经确认`); }) } announce(){ let mission = this.missions[this.nextMession++]; this.misssionSvc.announceMission(mission); this.history.push(`任务"${mission}"进入准备`); if(this.nextMession>=this.missions.length){ this.nextMession = 0; } } ngOnInit(): void { }}

? AstronautComponent:点击确认,向父组件传递确认的操作员信息。

import { Component, Input, OnInit, OnDestroy } from '@angular/core';import { Subscription } from 'rxjs';import { MissionService } from 'src/app/service/mission.service';@Component({  selector: 'app-astronaut',  template: `  

{{astronaut}}:{{mission}}

`,})export class AstronautComponent implements OnInit,OnDestroy{ @Input() astronaut:string=''; mission = ''; confirmed = false; announced = false; subscription:Subscription; constructor(private missionSvc:MissionService) { // 获取父组件的数据 this.subscription = missionSvc.missionAnnounce$.subscribe((mission)=>{ this.mission = mission;// 发射导弹 this.announced = true;// 激活确认按钮 this.confirmed = false; }) } confirm(){ // 禁用按钮 this.confirmed = true; // 点击确认,保存当前的操作员数据 this.missionSvc.confirmMission(this.astronaut); } ngOnDestroy(): void { // 防止内存泄漏 this.subscription.unsubscribe(); } ngOnInit() { }}

5.5 路由传值

? 按钮点击跳转:路由传参数由分号隔开。

import { Component, OnInit } from '@angular/core';import { Router } from '@angular/router';@Component({  selector: 'app-father',  template:``})export class FatherComponent implements OnInit {  obj:any=[    '书悟空',    '唐僧',  ];  constructor(private router:Router) {}  ngOnInit() {}  linkSon(){    this.router.navigate(['/son',{ name:this.obj,id:10010}]);    //http://localhost:4209/son;name=书悟空,唐僧;id=10010  }}
// private route:ActivatedRoutethis.route.params.subscribe((route)=>{       console.log(route);})

? 链接点击跳转:路由传参通过queryParams属性控制,由?、&符号分隔开。

链接跳到儿子组件中// http://localhost:4209/son?id=10010&name=书悟空&name=唐僧
// private route:ActivatedRoutethis.route.queryParams.subscribe((route)=>{       console.log(route);})

? 链接点击跳转:直接是用/分割路由传参。

{ path: 'son/:id', component: SonComponent },
链接跳到儿子组件中// http://localhost:4209/son/10010
// private route:ActivatedRoutethis.route.params.subscribe((route)=>{       console.log(route);})

还有其他通信方式:浏览器本地传值(localStorge、SessionStorge)、cookie

6 Angular的八大生命周期

6.1 ngOnChanges()

当angular检测到组件(或指令)重新设置数据绑定输入属性时响应。在被绑定的输入属性的值发生变化时调用,首次调用一定会发生在ngOnInit()之前,每一次改变绑定数据就调用一次这个钩子。OnChanges() 对应的函数 ngOnChanges(),该函数获取了一个对象,对象把每个发生变化的属性名映射在SimpleChange对象中,对象有属性当前值currentValue前一个值previousValue

? 父组件

我是父组件: {{dataSource}}

? 子组件

我是子组件: {{data}}
import { Component, Input, OnInit, SimpleChanges, OnChanges } from '@angular/core';// 子组件jsexport class TwoComponent implements OnInit,OnChanges {  @Input() data:any=0;  constructor() { }  ngOnInit(): void {    console.log('ngOnInit',this.data);  }  increment(){    this.data++;  }  decrement(){    this.data--;  }  ngOnChanges(changes: SimpleChanges): void {    console.log("previousValue:",changes['data'].previousValue);    console.log("currentValue:",changes['data'].currentValue);  }}

注意地,在子组件中操作是不能触发Onchanges钩子函数地,它是控制组件上属性的改变而触发

3.png

4.png

6.2 ngOnInit()

在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件,在第一轮ngOnChanges()完成之后调用,只调用一次

6.3 ngDoCheck()

检测变化,在每一个Angular变更检测周期(变化监测)中调用,在执行ngOnChangesngOnInit()方法之后调用。不管是数据绑定还是鼠标的点击事件,只要触发了都会触发这个钩子的调用。

{{dataSource}}
import { DoCheck,OnInit } from '@angular/core';export class SonComponent implements OnInit,DoCheck {  dataSource:any;  constructor() { }  ngOnInit(): void {    console.log("ngOnInit!");  }  ngDoCheck(): void {    console.log("DoCheck:",this.dataSource);  }}

5.png

6.4 ngAfterContentInit()

把内容投影进组件之后调用,在第一次执行ngDoCheck方法之后调用,只调用一次

import { AfterContentChecked, AfterContentInit,DoCheck, Input, OnInit } from '@angular/core';export class SonComponent implements OnInit,DoCheck,AfterContentInit{  @Input() data:any=0;  dataSource:any;  constructor() { }  ngOnInit(): void {    console.log("ngOnInit!");  }  ngAfterContentInit(): void {    console.log("ngAfterContentInit!",this.dataSource);  }  ngDoCheck(): void {    console.log("DoCheck:",this.dataSource);  }}

6.png

6.5 ngAfterContentChecked()

在每次完成被投影组件内容的变更检测之后调用。在执行ngAfterContentInit()ngDoCheck()方法之后调用。

import { AfterContentChecked, AfterContentInit, DoCheck, Input,  OnInit } from '@angular/core';export class SonComponent implements OnInit,DoCheck,AfterContentInit,AfterContentChecked{  @Input() data:any=0;  dataSource:any;  constructor() { }  ngOnInit(): void {    console.log("ngOnInit!");  }  ngAfterContentInit(): void {    console.log("ngAfterContentInit!",this.dataSource);  }  ngAfterContentChecked(): void {    console.log("ngAfterContentChecked!",this.dataSource);  }  ngDoCheck(): void {    console.log("DoCheck:",this.dataSource);  }}

7.png

6.6 ngAfterViewInit()

在初始化完组件视图及其子视图之后调用,在第一次执行ngAfterContentChecked()方法之后调用,只调用一次

export class SonComponent implements OnInit,DoCheck,AfterContentInit,AfterContentChecked,AfterViewInit{  dataSource:any;  constructor() { }  ngOnInit(): void {    console.log("ngOnInit!");  }  ngAfterContentInit(): void {    console.log("ngAfterContentInit!",this.dataSource);  }  ngAfterContentChecked(): void {    console.log("ngAfterContentChecked!",this.dataSource);  }  ngAfterViewInit(): void {    console.log("ngAfterViewInit!");  }  ngDoCheck(): void {    console.log("DoCheck:",this.dataSource);  }}

8.png

6.7 ngAfterViewChecked()

在每次完成组件视图和子视图的变更检测之后调用。在执行ngAfterViewInit()ngAfterContentChecked()方法之后调用。

9.png

6.8 ngOnDestroy()

在Angular每次销毁指令/组件之前调用并清扫,在这里反订阅可观察对象和分离事件处理器,以防内存泄漏。什么时候会调用这个生命周期呢?也就是平时我们切换组件或从一个组件跳转到另一个组件的时候,这时候就会触发组件的销毁。

更多编程相关知识,请访问:编程视频!!

以上就是Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/550661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 19:57:49
下一篇 2025年11月9日 19:58:27

相关推荐

  • 聊聊Angular中怎么将迁移tslint至eslint

    本篇文章带大家继续angular的学习,对比一下tslint和eslint,介绍一下angular中怎么将迁移tslint至eslint,希望对大家有所帮助! 大家好,最近做了Angular从12到13的升级,官方自动把angular.json中的tslint配置去除了,那么咱也最好遵从官方安排用起…

    2025年11月27日 web前端
    000
  • Angular学习之以Tooltip为例了解自定义指令

    本篇文章带大家继续angular的学习,以tooltip为例来了解一下自定义指令,希望对大家有所帮助! 在之前的文章中,我们已经概览了 Angular 的相关内容。在自定义指令的部分,我们已经能够实现编写,但是,在实际场景中,我们还需要标准化的管理。 Angular 是 Angular.js 的升版…

    2025年11月27日 web前端
    000
  • Angular如何进行视图封装?聊聊三种封装模式

    angular如何进行视图封装?下面本篇文章给大家深入了解一下angular encapsulation的三种方式,希望对大家有所帮助! 在日常工作中,当我们定义一个Component的时候,要考虑它的encapsulation封装性,也就是说你期望这个组件里定义的样式是只作用于这个组件,还是想作用…

    2025年11月27日 web前端
    100
  • 聊聊Angular+Service如何改进日志功能

    如何改善angular的日志使用方式?下面本篇文章给大家介绍一下使用angular中的service管理控制台输出,改进日志功能的方法,希望对大家有所帮助! 改善在Angular 应用中的日志使用方式 Angular是一个非常受欢迎的开发框架,前端开发者们喜欢在应用中使用console去调试它们的代…

    2025年11月10日 web前端
    100
  • 带你了解Angular中的组件通讯和依赖注入

    angular组件间怎么进行通讯?依赖注入是什么?下面本篇文章带大家简单了解一下组件通讯的方法,并介绍一下依赖注入,希望对大家有所帮助! 1.  组件通讯 1.1  向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/c…

    2025年11月10日 web前端
    500
  • angular如何引入css

    angular引入css的方法:1、在ts文件中设置“@Component({styleUrls:[‘css文件路径’]})”语句;2、在ts文件中设置“@Component({styles:[`css样式代码`]})”语句。 本教程操作环境:windows7系统、angul…

    2025年11月10日 web前端
    100
  • 聊聊Angular中NgTemplateOutlet指令的理解和用法

    本篇文章带大家了解一下angular中ngtemplateoutlet指令,介绍一下ngtemplateoutlet这个结构性指令的理解与应用,希望对大家有所帮助! 最近在看一个培训项目的时候有看到这个NgTemplateOutlet这个结构性指令,但是我之前没接触过,不知道这东西是怎么用的,然后,…

    2025年11月10日 web前端
    100
  • 一起聊聊angular的样式隔离实现机制

    angular是怎么进行样式隔离的?下面本篇文章就来和大家一起聊聊angular的样式隔离实现机制,希望对大家有所帮助! angular 以组件为基本单位。我们编写一个一个的组件,再将这些组件组合为一颗组件树。但是在开发的过程中,经常需要在父组件中覆盖子组件的样式。比如现在我们有一个parent 组…

    2025年11月9日 web前端
    000
  • angular学习之浅析响应式表单

    本篇文章带大家继续angular的学习,了解一下angular中的响应式表单,介绍一下全局注册响应式表单模块、添加基础表单控件的相关知识,希望对大家有所帮助! 响应式表单 Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。【相关教程推荐:《angular教程》】 …

    2025年11月9日 web前端
    000
  • 浅析Angular+rxjs怎么实现拖拽功能?

    angular+rxjs怎么实现拖拽功能?下面本篇文章给大家介绍一下angular 结合 rxjs 实现拖拽的方法,希望对大家有所帮助! 在之前的文章,我们学习了 Angular 中自定义 Video 操作,没有度过的读者可先了解。 现在有这么一个需求,你会怎么实现呢? 页面中 video 标签,当…

    2025年11月9日 web前端
    000
  • angular学习之聊聊指令和管道

    本篇文章带大家了解一下angular中的指令(directive)和管道(pipe),简单介绍一下相关知识点:内置指令和自定义指令,内置管道和自定义管道,希望对大家有所帮助! 指令 Directive 指令是 Angular 提供的操作 DOM 的途径。指令分为属性指令和结构指令。 属性指令:修改现…

    2025年11月9日 web前端
    100
  • angular学习之聊聊组件通讯和组件生命周期

    本篇文章带大家了解一下angular中的组件通讯和组件生命周期,简单介绍一下向组件内部传递数据、组件向外部传递数据的方法,希望对大家有所帮助! 组件通讯 1、向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/core’…

    2025年11月9日 web前端
    100
  • 什么是装饰器?聊聊Angular中怎么使用方法装饰器?

    什么是装饰器?本篇文章给大家介绍一下angular中使用方法装饰器的方法,希望对大家有所帮助! 方法装饰器并不是 Angular 的专属特性,在 es6 中也有着这种特性,本文主要是介绍 方法装饰器 在 Angular 中的使用。【相关教程推荐:《angular教程》】 什么是装饰器 在es6中,装…

    2025年11月9日 web前端
    000
  • 浅析Angular中的独立组件,看看怎么使用

    本篇文章带大家了解一下angular中的独立组件,看看怎么在angular中创建一个独立组件,怎么在独立组件中导入已有的模块,希望对大家有所帮助! Angular 14一项令人兴奋的特性就是Angular的独立组件终于来了。 在Angular 14中, 开发者可以尝试使用独立组件开发各种组件,但是值…

    2025年11月9日 web前端
    200
  • angular如何进行性能优化?变更检测方式浅析

    angular如何进行性能优化?下面本篇文章给大家深入介绍一下angular 性能优化方案–变更检测,希望对大家有所帮助! angular 性能优化——变更检测          对于前端性能指标描述,业界都各有说词,总结下来都和首屏性能和页面流畅度相关,本次将会从页面流畅度的角度,对页…

    2025年11月9日 web前端
    000
  • 聊聊Angular Route中怎么提前获取数据

    angular route中怎么提前获取数据?下面本篇文章给大家介绍一下从 angular route 中提前获取数据的方法,希望对大家有所帮助! 提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用 resolver, 在 Angula…

    2025年11月9日 web前端
    000
  • 项目过大怎么办?如何合理拆分Angular项目?

    angular项目过大,怎么合理拆分它?下面本篇文章给大家介绍一下合理拆分angular项目的方法,希望对大家有所帮助! Angular 让人诟病的一点就是打包后体积很大,一不小心 main.js就大的离谱,其实遇到类似的问题,不管是体积大、数据大、还是流量大,就一个思路:拆分。再配合浏览器的缓存机…

    2025年11月9日 web前端
    000
  • Angular中什么是结构指令?怎么使用?

    本篇文章带大家了解一下angular 中结构指令模式,介绍一下结构指令是什么且怎么使用,希望对大家有所帮助! 在 Angular 中,有两种类型的指令。属性指令修改 DOM 元素的外观或者行为。结构指令添加或者移除 DOM 元素。 结构指令是 Angular 中最强大的特性之一,然而它们却频繁被误解…

    2025年11月9日 web前端
    100
  • 聊聊自定义angular-datetime-picker格式的方法

    怎么自定义angular-datetime-picker格式?下面本篇文章聊聊自定义格式的方法,希望对大家有所帮助! 最近一直都在使用 Angular 进行开发,维护项目。遇到了日期的问题,同事采用的是 @danielmoncada/angular-datetime-picker。 PS:当然,如果…

    2025年11月9日 web前端
    000
  • 详解Angular项目中怎么给路径添加指定访问前缀

    angular项目中怎么给路径添加前缀?下面本篇文章给大家介绍一下angular项目路径添加指定的访问前缀的方法,希望对大家有所帮助! 开发多个项目的时候,我们希望能通过指定的前缀路径去访问不同的项目。比如,通过前缀 /projectA/ 去访问项目 A;通过前缀 /projectB/ 去访问项目 …

    2025年11月9日 web前端
    000

发表回复

登录后才能评论
关注微信