angular技术(持续更新)

news2025/7/20 13:13:46
  1. css类绑定

  1. [class.color-blue]="isBlue()" 如果isBlue()返回为true 这里使用color-blue的class样式

  1. style样式绑定

  1. [style.background-color]="canclick ? 'blue': 'red'"

组件与模块

模块的元数据

*declarations: 用于指定属于这个模块的视图类(View Class),即指定哪些部件组成了这个模块

angular 有组件 指令 和管道三种视图类

exports: 导出视图类

imports:引入该模块依赖的其他模块或路由,引入后模块里的组件模板才能引用外部对应的组件,指令和管道

providers: 指定模块依赖的服务,引入后该模块的所有组件都可以使用这些服务

父子组件之间传值

子组件
item.component.ts
export class ListItemComponent implements OnInit{
    @Input() contact:any {}; 注解,输入接受从父组件传过来的contact
    @OutPut() routerNavigate = new EventEmitter<number>();//输入方法
父组件
list.component.html
<list-item [contact]="contact"  (routerNavigate)="routerNavgate($event)"></list-item>
}

set属性拦截

_contact: object = {};
set contactObj(contact: object) {
    this._contact.name = contact.name.trim()
}
get contactObj() {
   rerurn this.contact
}

或者
 [(selectedTabIndex)]="_selectedTabIndex">

  /**
   * 获取被选中的tab索引值
   */
  get selectedTabIndex() {
    return this._selectedTabIndex;
  }

  /**
   * 设置被选中的tab索引值
   */
  set selectedTabIndex(index: number) {
    this._selectedTabIndex = index;
    console.log(index,this._selectedTabIndex)
  }

组件交互:

子组件向父组件传递数据

  • @Output()

  • 通过局部变量获取子组件引用

  • 父组件使用@ViewChild获取子组件引用

  
<div class="content-tabList"
 #tabContentListContainer>
</div>
@ViewChild('tabContentListContainer') tabContentListContainer: ElementRef;
    const tabListDom = this.tabContentListContainer.nativeElement;

组件生命周期

  1. ngOnChanges()

  1. ngOnInit()

  1. ngDoCheck()

  1. ngAfterContentInit()

  1. ngAfterContentChecked()

  1. ngAfterViewInit()

  1. ngAfterViewChecked()

  1. ngOnDestroy()

注意:ngDoCheck() 和ngOnchanges不应该一起使用

服务:

服务一般是封装某种特定功能的独立模块

@Injectable

import { Injectable } from '@angular/core'
 @Injectable()
 export class SharedService {
   list: string[] = []
     append(str: string) {
      this.list.push(str);
    }
}

共享服务实例:
父组件
providers: [sharedService]

export class ParentComponent {
    list: string[] = [];
     constructor(private _sharedService: sharedService)
    ngOnInit():any {
        this.list = this._sharedService.list
    }
}

http服务:

  1. 在模块装饰器@NgModule中导入HttpModule

  1. 在组件模块中导入HTTP服务

  1. 在组件的构造函数中声明引入

// app.module.ts
 import { HttpModule }  from '@angular/http';

@NgModule({
   imports: [
        HttpModule // 1 在NgModule中导入HttpModule
    ]
     bootstrap: [AppComponent]
})

export class AppModule{}

引入服务

import {Http} from '@angular/http'// 导入http的服务

@Component ({
    selector: 'contact',
    template: `<div>hello http service!</div>`
})
  export class ContactComponent{
    contstructor(http: Http)// 声明引入
}

Observable处理异步请求

@Injectable()
export class ContactService {
   constructor(private _http: Http) {}
   getContacts(): Observable<any[]> {
        return this._http.get(xxx)
            .map(this.extractData)
            .catch(this.handleError)
        }
    }

Observable异步请求为冷处理

export class ContactComponent {
    contractor (
        private: _contractService: ContactService
    ){}
    getContracts() {
        return this._contractService.getContracts()
            .subscribe(
            contacts => this.contracts = contracs,
            error = > this.errorMsg = error
        )
    }
}

Observable对象转成Promise的版本

@Injectable()
export class ContactService {
    constructor(private _http: Http) {}

     getContacts(): Promise<any[]>{
        return this._http.get(xxx)
               .toPromise()
               .then(this.extractData)
                .catch(this.handleError) 
    }    
}

请求依赖

let getFirstDataObs = Rx.Observable.create(observer => {
    observer.next(getFirstData());
    observer.complete();
})
 let createSecondDataObs = function(firstData) {
    return Rx.Observable.create(observer => {
         getSecondData(firstData,secondData => {
                 observer.next(seconData);
                 observer.complete
            })
        })
}

通过Observable.prototype.concatMap()的方法,getSecondDataObs()的
数据流紧接在getFirstDataObs()的数据流后,并且最终数据流被subscribe()捕获
let observable = getFirstDataObs.concatMap(firstData => {
        return createSecondDataObs(firstData)
    }).subscribe(secondData => {
    doSomethingWithSecondData(seconData);
})

依赖注入

  1. 在组件中注入服务

  1. 在服务中注入服务

  1. 在模块中注入服务

  1. 层级注入

  1. 注入到派生组件

  1. 限定方式的依赖注入

  1. 使用provider注入

在服务中注入

在模块中注入

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

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

相关文章

CM6.3.2启用Kerberos(附问题解决)

基础准备支持JCE的jdk重新安装JCE的jdk(已正确配置跳过)删除/usr/java/下面的jdk,然后通过CM->管理->安全->安装Java无限制...重新安装后,配置Java(可选)主机->主机配置->搜java->Java主目录 配置路径主机->所有主机->设置->高级:Java配置Kerberos安…

[算法]插入排序

参考&#xff1a;《漫画算法-小灰的算法之旅》 目录 1、排序算法的思想 2、具体步骤 3、插入排序的优化 4、时间复杂度和空间复杂度 5、代码 1、排序算法的思想 维护一个有序区&#xff0c;把元素一个个插入有序区的适当位置&#xff0c;直到所有元素都有序为止。 2、具体…

多线程面试题

1. Sychronized的锁升级过程是怎样的&#xff1f; 2. Tomcat 中为什么要使用自定义类加载器&#xff1f; 3. 说说对线程安全的理解 4. 对守护线程的理解 5. 并发、并行、串行之间的区别 6. Java死锁如何避免&#xff1f; 7. 谈谈你对AQS的理解&#xff0c;AQS如何实现可重入锁&…

华为机试题:HJ107 求解立方根(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

2023年品牌惊蛰节气海报赏析

今天是3月6日——惊蛰&#xff0c;春日渐暖&#xff0c;春雷乍起&#xff0c;北方大地正在迎来新生&#xff0c;小鸟在枝头欢叫、种子在努力发芽&#xff0c;各大品牌也赶早发布了最新的惊蛰节气海报。下面就来和我们一起看看吧。 1&#xff0c;中国日报 2&#xff0c;BDuck…

java日志

日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试&#xff0c;维护方便&#xff0c;以及应用程序的运行时信息结构化存储。日志记录确实也有它的缺点。它可以减缓的应用程序Log4jLog4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我…

Spring | 基础

1. IOC和DI IOC&#xff1a;控制反转&#xff0c;其思想是反转资源获取的方向&#xff0c;传统的资源查找方式要求组件向容器发起请求查找资源&#xff0c;作为回应&#xff0c;容器适时的返回资源。而应用了 IOC 之后&#xff0c;则是**容器主动地将资源推送给它所管理的组件…

Sectigo中间证书根证书说明

Sectigo SSL证书产品证书链主要分为两个版本&#xff0c;常见的的一种版本多&#xff0c;但随着安全性提升&#xff0c;证书链的加载方式变化&#xff0c;第二种版本证书链更具备安全需要&#xff0c;对此做了详细说明。一、兼容性最高版本&#xff0c;根证书算法&#xff1a;s…

BI 是如何数据分析的?

企业部署商业智能BI前&#xff0c;需要进行详细的分析&#xff0c;了解BI能为企业带来多少价值&#xff1f;如何提高工作效率的等等&#xff0c;今天我们就来聊一聊 BI 的工作原理。 一、BI的取数方式 商业智能BI是通过访问和连接业务系统数据源数据库的方式来进行取数的&…

记录gitlab和jenkins集成的过程

gitlab设置外发请求 首先在前面的几篇文章中&#xff0c;我们的gitlab和jenkins都安装好了&#xff0c;在这里我们就可以对gitlab 和jenkins进行集成操作处理。 首先设置gitlab的外发请求,如图所示: 先点击管理员&#xff0c;进入到管理中心后 先点击设置&#xff0c;然后点击…

劲霸男装:400+门店的销售佣金管理,如何实现一键发薪

陪伴一代人记忆的劲霸男装&#xff08;下文简称「劲霸」&#xff09;&#xff0c;很多人应该都不陌生。 他们的门店遍布全国的大型商场及街边店铺&#xff0c;自1980起&#xff0c;发展已40余年&#xff0c;现拥有形象统一、规范管理的品牌专卖店2000多家。他们门店多&#xff…

传输层协议——UDP协议

❣️关注专栏&#xff1a;JavaEE 传输层虽然是操纵系统内核已经实现好了的&#xff0c;但是我们程序猿写代码要调用系统提供的 socket API 完成网络编程&#xff0c;其中 socket 就属于传输层部分。 &#x1f331; UDP协议 &#x1f331; 1 UDP协议端格式 上图就是UDP协议报…

Java面向对象特征之三:多态

一&#xff1a;面向对象三大特征之三&#xff1a;多态 1.多态是什么&#xff1f; 同类型的对象&#xff0c;执行同一个行为&#xff0c;会表现出不同的行为特征。 比如&#xff1a;猫和狗都是动物类型&#xff0c;执行同一个行为&#xff0c;但是会表现出不同的行为特征&…

flink sql 源码走读 --- 解释flink jdbc where 条件为什么没有下推数据库

本文通过一个具体案例&#xff0c;说明 flink sql 如何实现 connector 加载、source/sink 端操作、数据库连接等。可以帮助大家了解其原理&#xff0c;并在代码中找到落库执行SQL生成逻辑&#xff0c;得到where条件并没有下推到库执行的结论。 案例如下&#xff1a; create t…

Zookeeper集群和Hadoop集群安装(保姆级教程)

1. HA HA&#xff08;Heigh Available&#xff09;高可用 解决单点故障&#xff0c;保证企业服务 7*24 小时不宕机单点故障&#xff1a;某个节点宕机导致整个集群的宕机 Hadoop 的 HA NameNode 存在单点故障的可能&#xff0c;需要配置 HA 解决引入第二个 NameNode 作为备份同…

C语言学习(三)

#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0&#xff1b;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值&#xff0c;需要按一下enter…

MySQL知识点全面总结2:Mysql语句的执行(DDL DML 完整性约束)

二.MySQL知识点全面总结2&#xff1a;mysql语句的执行&#xff08;DDL DML 完整性约束&#xff09; 1.对数据库的操作&#xff08;DDL&#xff09; 2.对数据表的操作&#xff08;DDL&#xff09; 3.对数据表字段的操作&#xff08;DDL&#xff09; 4.对数据表内容的增删改&…

Science Direct 高级检索、使用技巧、寻找目标期刊、E lsevi er 投稿指南

ScienceDirect使用教程&E ls evier投稿指南1. 高级检索功能1.1 布尔值运算符和短语搜索&#xff08;构建检索式&#xff09;1.2 搜索特殊字符和公式1.3 非搜索用词2. 如何使用搜索结果页面&#xff1f;3. 下载多个文档3.1 从搜索结果列表中下载多个文档3. 利用 JournalFind…

java高性能并发计数器之巅峰对决

并发计数器各个方案介绍方案概述1. jdk5提供的原子更新长整型类 AtomicLong2. synchronized3. jdk8提供的 LongAdder 【单机推荐】4. Redisson分布式累加器【分布式推荐】方案介绍jdk5提供的原子更新长整型类 AtomicLong在JDK1.5开始就新增了并发的Integer/Long的操作工具类Ato…

VS2022+qt5.14.2配置qcustomplot2.1.16(坑很多)

目录1. 前言2. 下载QCustomPlot的源码3. 将QCustomPlot添加到QT项目&#xff08;一些遇到的问题&#xff09;1. 前言 QCustomPlot 是一个超强超小巧的qt绘图类&#xff0c;非常漂亮&#xff0c;非常易用&#xff0c;只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用…