angular入门

2023-11-14

架构模式
MVC -> MVP -> MVVM
angular/cli
angular/cli:angular脚手架,一键构建angular项目
常用指令:
ng help 查看所有指令

  1. ng new projectName – 创建angular项目
  2. ng g component my-new-component – 创建组件component ……还有很多看文档
  3. ng serve 启动项目,–port 4201 指定特定的端口号
  4. ng build 打包项目(webpack) --aot aot编辑
  5. – hmr 热替换
    安装流程:
  6. node 安装不用说了
  7. 全局安装angular-cli npm install -g @angular/cli@latest;
  8. npm如果慢可用cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org;
  9. 用cli新建angular项目 进入需要安装的文件夹后执行ng new projectName,会自动用npm安装angular的依赖包,如果觉得慢可以ctrl + c退出,到项目文件夹执行cnpm install
  10. 启动angular项目 ng serve 打开localhost:4200 默认地址;
    事项:
    用Scss创建项目
    ng new sassy-project --style=scss //创建scss的ng项目
    Scss下引入`bootstrap
    $icon-font-path: ‘~bootstrap-sass/assets/fonts/bootstrap/’;
    @import ‘~bootstrap-sass/assets/stylesheets/_bootstrap’;
    规范:
    定义变量和函数请申明好类型或interface
// workList.model.ts
export interface workList {
    /**
     * val id值
     */
    val: string;
    /**
     * text 文本值
     */
    text: string;
}
import { workList } from "./workList.model";
      getWorkList(): Promise<workList[]> {
        return Promise.resolve([
            { val: "1", text: "aa" },
            { val: "2", text: "bb" },
            { val: "3", text: "cc" },
            { val: "4", text: "dd" }
          ]);
      }
// 函数 定义申明及解释
  /**
   * 发送广播
   * @param val 广播val值
   */
  $broadcast(val: string) {
    this.broadcast.emit(val);
  }
  /**
   * 发送全局消息
   * @param message 消息值
   */
  sendMessage(message: string) {
    this.subject.next(message);
  }

这里写图片描述
这里写图片描述
文件目录:

.
├── README.md
├── e2e                                     // e2e测试
│   ├── app.e2e-spec.ts
│   ├── app.po.ts
│   └── tsconfig.e2e.json
├── karma.conf.js                           // karma配置文件
├── package.json                            // 依赖包
├── protractor.conf.js                      // 测试的配置环境
├── src                                     // 项目根目录
│   ├── app
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   └── app.module.ts                   // 应用的根模块
│   ├── assets                              // 放ico、图片,字体。构建后会copy到dist文件
│   ├── environments                        // 配置开发环境还是生成环境
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── favicon.ico
│   ├── index.html                          // 应用入口html文件
│   ├── main.ts                             // 应用入口文件 (引导AppModule根模块启动引用)
│   ├── polyfills.ts                        // 填充文件 兼容ie……
│   ├── styles.css
│   ├── test.ts                             // 单元测试入口文件
│   ├── tsconfig.app.json
│   ├── tsconfig.spec.json
│   └── typings.d.ts
├── tsconfig.json                           // ts配置文件
└── tslint.json

@NgModule

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
// import 引入访问公开对象
// export 声明公开对象
// declarations 申明组件(组件、指令、管道)
// exports 声明其他模块,供其他Module使用
// imports 引入需要的模块
// providers 供应商  全局的服务 service
// bootstrap 启动项 标识主视图(根组件)

路由or懒加载:
基本

<li routerLink='/task/workOrder' routerLinkActive="active"><a>我的任务</a></li>
<router-outlet></router-outlet> // 占位符
RouterModule.forRoot() // 根模块
RouterModule.forChild() // 子模块
redirectTo 重定向
pathMatch 路由匹配  full 
loadChildren 懒加载  module # moduleName  #号前面模块地址  #后面模块名称
RouterModule.forRoot(routes, { useHash: true });
(前后台路由冲突出现404)`useHash=true` 会再路由前面加个#,
const routes: Routes = [
    { path: '', redirectTo: 'login', pathMatch: 'full' },
    { path: 'task', loadChildren: './workspace/workspace.module#WorkspaceModule' },
    { path: 'login', component: LoginComponent }
];

路由传参

传递:
import { Router} from '@angular/router';
this.Router.navigate(["地址",{id:id,name:name}(多个)])
接收:
import { ActivatedRoute } from '@angular/router';
this.activatedRoute.params.subscribe( res => { console.log(res) });
html传递:
<a *ngFor="let item of list"  [routerLink]="['/detail', item.id]" >
<a routerLink="/workspace/workone/id" >标签跳转传值</a>
route设置:
{ path: 'detail/:id', component: nameComponent }

指令及数据绑定:
数据绑定
1.单向 数据 -> 视图
这里写图片描述这里写图片描述

{{name}}插入值
<input [value]='name' [attr.disabled]='isDisabled'/>
[attr.disabled]="'true'"
[value]="'name'"

2.单向 视图 -> 数据(事件)
这里写图片描述

<input 
  (keyup)="clickMe($event,'keyup')" 
  (keydown)="clickMe($event,'keyDown')" 
  (change)="clickMe($event,'change')" 
  (focus)="clickMe($event,'focus')" 
  (blur)="clickMe($event,'blur')"
/>

3.双向 视图 <–> 数据

<input [(ngModel)]="name"/>

4.内置指令
ngIf else

<div *ngIf="false; else elseBlock">111111111111111</div>
<ng-template #elseBlock>2222</ng-template>

ngIf then else

<div *ngIf="false; then thenBlock else elseBlock">11</div>
<ng-template #thenBlock>22...</ng-template>
<ng-template #elseBlock>33...</ng-template>

as

<div *ngIf="1111 as isShow; else elseBlock">{{isShow}}</div>
//显示 1111
<div *ngFor="let item of [9,8,7,6,5]; index as i; trackBy:item">
  {{i}} --- {{item}}
</div>
// 显示 
0 --- 9
1 --- 8
2 --- 7
…………

ngFor trackBy

<div *ngFor="let item of list"></div>
<div *ngFor="let item of list; trackBy:item.id"></div>

style Class

<div [ngStyle]="{style: expression}"></div>
<div [ngClass]="{cssClass: expression}"></div>

ngSwitch

<div [ngSwitch]="conditionExpression">
  <div *ngSwitchCase="expression">output</div>
  <div *ngSwitchDefault>output2</div>
</div>

dom操作:
ElementRef: 获取dom

// html
<div class="nameClass" id="nameId"></div>
// ts
import { ElementRef } from '@angular/core';
const nameClass = this.eleRef.nativeElement.querySelector('.nameClass');
this.eleRef.nativeElement.querySelector('#nameId');
this.elementRef.nativeElement.contains(nameClass)

Renderer2 渲染器
用来创建元素、文本、设置属性、添加样式和设置事件监听…………

 changeHostState() {
    if (this.active) {
      this.renderer.addClass(this.elementRef.nativeElement, this.stateCss);
      return;
    }
    this.renderer.removeClass(this.elementRef.nativeElement, this.stateCss);
  }

拦截器及服务(httpClient):
查看taskInterceptor.service.ts
app.module.ts
生命周期钩子:

//8种
ngOnChange();
ngOninit()
ngDoCheck(); 
ngAfterContentInit()
ngAfterContentChecked()
ngAfterViewInit()
ngAfterViewChecked();
ngOnDestroy()

组件通讯
父->子: @input() 父组件添加子组件的引用@ViewChild()来获取子组件
子-> 父: @Output()
通过service
EventEmitter
订阅Subject next订阅
添加订阅后切记在ngOnDestroy生命周期中取消unsubscribe订阅
管道pipe:
内置管道

<div>{{1507793573000 | date: 'y-MM-dd HH:mm:ss'}}</div>
<div>{{ '1507794154000000' | slice:0:13 | date:'y-MM-dd HH:mm:ss'}}</div>
<div>{{'zzz' | uppercase }}</div>
<div>{{'ZZZsS' | lowercase }}</div>
<div>{{ 3.14159265 | number: '1.4-4' }}</div>
<div>{{ { name: 'semlinker' } | json }}</div>

自定义管道

@NgModule({
  declarations: [DateAppendzeroPipe],
  …………
)}
<div>{{ '1507794154' | dateAppendzero | date:'y-MM-dd HH:mm:ss' }}</div>
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'dateAppendzero'
})
export class DateAppendzeroPipe implements PipeTransform {
  transform(value: any): any {
    return value + '000';
  }
}

依赖注入(DI):
依赖注入
AOT(预编译) or JIT(即时编辑)编译
JIT:先tsc编译成js文件,打包压缩,浏览器加载代码,启动angular,通过JIT编译处理代码,然后再渲染应用。

AOT: 在服务端预先编译好所有文件,浏览器直接加载代码运行,直接渲染应用,不同等编译后再运行渲染,打包文件中也不需要angular编译器,编译器都就占angular自身大小的一半。预先编译的话会预先检测模版绑定的一些错误。

JIT:
这里写图片描述
这里写图片描述
AOT:
这里写图片描述
这里写图片描述
HMR(热替换):
这里写图片描述

npm install @angularclass/hmr -D 
// -D: --save-dev -S: --save

更改main.js

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
  enableProdMode();
}else{
  if (module.hot) {
    module.hot.accept();
    module.hot.dispose(() => {
      let _styles = document.head.querySelectorAll('style');
      let styles = Array.prototype.slice.call(_styles);
      styles
        .filter((style: any) => style.innerText.indexOf('_ng') !== -1)
        .map((el: any) => document.head.removeChild(el));
    })
  }
}
platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));

杂:
删除node_modules包提示路径过长

npm install rimraf -g
rimraf node_modules
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular入门 的相关文章

  • 如何处理并不总是返回承诺的函数?

    处理函数并不总是返回 Promise 的情况的最佳方法是什么 我的实际代码太复杂 无法解释 但问题的本质归结为检查条件 根据它 我要么返回一个局部变量 要么需要发送一个 ajax 请求 像这样的事情 function example val
  • 我如何在 AngularJS 中监听点击并按住的情况?

    我制作了一个时间计数器 您可以通过单击按钮来增加或减少时间 然而 我希望当我单击并按住按钮时 时间的价值会不断攀升 所以目前如果你看到我的Plunkr http plnkr co edit BxX9x5zYFMXVqt5JsN1F p pr
  • 如何从 jQuery 对话框按钮访问我的角度范围?

    http plnkr co edit Rf0VItthVBg6j0z7KudO http plnkr co edit Rf0VItthVBg6j0z7KudO 我正在使用 jQuery 对话框 并且想要使用对话框按钮 但我不知道如何获取范围
  • jQuery 插件不能很好地与 Angularjs 配合使用

    我用过jQuery 滑块在我的项目中 我使用 Angular 加载图像 我目前的观点是这样的 div div class slides container a href img width 919 height 326 alt a div
  • 类型错误:无法读取未定义的属性“defaultPrevented”

    当我进行以下测试时 我收到此错误 it should call pauseAnimationInterval if in focus inject function SearchBoxData intervalManager timeout
  • AngularJS - 设置下拉列表的选定值不起作用

    我在这里复制了我的问题 http jsfiddle net U3pVM 2840 http jsfiddle net U3pVM 2840 正如标题所示 我无法设置使用 ng options 填充的选择的选定值 我已经搜索并尝试了我找到的所
  • angularjs ui-router:获取给定状态的子状态列表

    您知道 ui router 中获取给定状态的子状态列表的方法吗 我正在使用 ui router 实现一个复杂的 SPA 可能有 4 级深度导航 我想实现从路由器表自动生成的第二级导航选项卡界面 为此 我需要获取给定状态 可能是抽象状态 的直
  • 如何计算表格上的错误数量?

    FIDDLE http jsfiddle net FeS4A 78 我如何计算表格上的错误数量 HTML div Sorry but 3 errors have been made div 您可以通过使用特定错误标准的特定计数来实现此目的的
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 如何在 AngularJS 中刷新/使 $resource 缓存失效

    我有一个简单的 User resource 它使用默认的 http 缓存实现 如下所示 factory User function resource return resource endpoint user current project
  • Protractor:是否可以测试我的应用程序中没有404?

    我是量角器的新手 我想编写一个测试来查看是否存在带有 url 的锚点给出 404 错误 我见过这个如何用量角器测试html链接 https stackoverflow com questions 29212375 how to test h
  • 如何在 AngularJS 中测试具有解析属性的控制器?

    如何测试具有解析属性的控制器 它会抛出一个错误 未知提供者 InitProvider 在测试期间 这是可以理解的 我该如何测试它 我使用路由配置中的 init 属性来加载数据 并在控制器实例化时将其传递给控制器 以便在加载数据之前路由不会更
  • 如何创建一个非单例的 Angular JS 服务?

    因为每个服务都是单例 调用 injector get 每次仍然给我相同的实例 如何在另一个服务中使用一个服务的多个实例 请记住 我的非单例类的声明不得污染全局命名空间等 我的示例如下 我希望 injector get serviceCall
  • 对角度“数据表”中的列进行排序

    我创建了表 table class table table striped table bordered table hover width 100 thead tr th Nannie ID th th Name th th Last n
  • 尝试使用 ui-router 让一个子视图调用另一个子视图

    我有两个子视图 一个用于类别 一个用于产品 因此是该类别的产品 我希望用户能够选择一个类别并查看该类别的所有产品 所以我在类别控制器中调用一个函数View单击类别行上的按钮 这是函数 self scope viewSalonProducts
  • 如何从 Angular 计时器获取当前时间

    我正在测试角度计时器 http siddii github io angular timer 并且发现自己想知道如何在控制器中获取当前时间 以便将其用于我可能有的任何目的 例如 我想当达到特定的分钟数时 将计时器的字体颜色设置为红色 但我完
  • 使用 Angularjs,$http 在 Microsoft Edge 中发布返回响应错误

    好吧 当我开发一个管理页面进行测试时 Microsoft Edge 中出现了一个奇怪的问题 这是从loginCtrl js服务器获取响应的部分源代码 http method POST url Define apiUrl admin logi
  • 取消嵌套 ng-click 调用之间的事件传播的最佳方法是什么?

    这是一个例子 假设我想要像很多网站一样有一个图像叠加层 因此 当您单击缩略图时 整个窗口上会出现黑色覆盖层 并且图像的较大版本位于其中的中心 单击黑色覆盖层可将其关闭 单击图像将调用显示下一张图像的函数 html div class ove
  • 大型 AngularJS 应用程序设计

    我需要关于设计具有多个复杂模块的 AngularJS 应用程序的建议 并根据用户角色在身份验证和授权后加载模块 有些用户可以访问一个简单的模块 有些用户可以访问仪表板 有些用户可以访问 2 个以上的模块 我们已经确定了许多可以在不同模块中重
  • 使用 JWT Laravel 5 进行身份验证,无需密码

    我正在尝试学习 Laravel 我的目标是能够构建一个 RESTful API 不使用视图或刀片 仅使用 JSON 结果 稍后 AngularJS Web 应用程序和 Cordova 混合移动应用程序将使用此 api 经过一番研究 我倾向于

随机推荐

  • windows下WS2tcpip.h和windows.h报错

    include
  • java.lang.NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment

    最近做项目遇到场景 通过前端提交的JAVA代码 创建java文件 然后再编译JAVA文件称class文件 具体实现的细节 就不细说了 最后执行的结果能正常执行 但控制台报错 Can t initialize javac processor
  • Zotero

    用户笔记区代码问题 用户笔记区用于记录阅读文献中的总结 是很重要的笔记模块 Zotero IF 插件提供了obsidian用户笔记区这一功能 很有用 但经本人实际使用发现 Zotero IF插件官网给的用户笔记区模板并不实用 主要存在以下几
  • 【牛客刷题专栏】0x32:JZ45 把数组排成最小的数(C语言编程题)

    前言 个人推荐在牛客网刷题 点击可以跳转 它登陆后会保存刷题记录进度 重新登录时写过的题目代码不会丢失 个人刷题练习系列专栏 个人CSDN牛客刷题专栏 题目来自 牛客 题库 在线编程 剑指offer 目录 前言 问题描述 解法思路 代码结果
  • 数字信号带宽讲解

    引言 在学习和工作中 经常和数字信号打交道 但是经常会接触到数字信号的带宽 对于这一概念 我理解的并不是很透彻 所以今天来抽丝剥茧 把这一概念彻底理解清楚 内容引申 要理解数字信号带宽 就先要了解信号的上升时间 上升时间 上升时间的概念 任
  • Win定时任务更新SVN库

    找到计算机管理 右击任务计划程序库 gt 创建基本任务 填写好名称和描述 NEXT NEXT NEXT 这里选择好svn exe 参数配置成 update D your dictionary NEXT 设置属性 选择触发器 gt 编辑 设置
  • 修改docker容器中文件(配置文件)

    背景 在使用docker搭建hadoop时需要修改docker容器里的文件 不想装ubutu所以在容器里用不了vim命令修改文件 1 查看所有容器名称和基本信息 docker ps 2 查看某个容器信息 docker inspect 容器名
  • 了解数据库的作用、特点及关系型数据库管理系统

    学习目标 能够知道数据库的作用数据库和数据库管理系统的关系 一 数据库 1 数据库的介绍 数据库就是存储和管理数据的仓库 数据按照一定的格式进行存储 用户可以对数据库中的数据进行增加 修改 删除 查询等操作 2 数据库的分类 关系型数据库
  • 干货渗透测试面试题汇总

    干货 渗透测试面试题汇总 以下为信息安全各个方向涉及的面试题 星数越多代表问题出现的几率越大 没有填答案是希望大家如果不懂能自己动手找到答案 祝各位都能找到满意的工作 注 做这个List的目标不是全 因为无论如何都不可能覆盖所有的面试问题
  • c++,父类引用指向子类对象,虚函数

    include
  • 还不错的全民采矿小程序源码+代码已开源

    正文 还不错的全民采矿小程序源码 代码已开源 可配合流量主和激励视频 程序是单开版的 一个站点只能单个平台使用此应用 一个小程序使用此应用 下方图片是小程序工具介绍 下方是程序介绍 程序 lanzou com iRgwE04a5d0d 图片
  • 基于嵌入式Linux/Qt 开发RFID智能仓储指纹管理系统

    基于嵌入式Linux Qt 开发RFID智能仓储指纹管理系统 Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架 它包括一个直观的API和一个丰富的类库 以及用于GUI开发和国际化的集成工具 另外它支持Java 和C 开发 利用它 我
  • AIX下装unzip和gzip

    做个标注 AIX下安装oracle需要解压zip文件 所以需要安装unzip文件包 首先确定aix里有没有rpm rte包 lslpp l grep i rpm rte 如果没有的话需要用aix安装盘安装这个包 我的系统里现在有这个包了 就
  • Deque与Stack实现栈的区别

    使用Deque 允许两头都进 两头都出 这种队列叫双端队列 Double Ended Queue 简称Deque Java集合提供了接口Deque来实现一个双端队列 它的功能 既可以添加到队尾 也可以添加到队首 既可以从队首获取 又可以从队
  • Cloudstack常用端口(Ports used by CloudStack)

    Cloudstack常用端口 Ports used by CloudStack 管理服务器 8080 主界面 授权API端口 8096 用户 客户端连接CS管理端 不可靠的 8787 CloudStack Tomcat debug sock
  • 华为OD机试真题- 基站维修工程师【2023Q1】【JAVA、Python、C++】

    题目描述 小王是一名基站维护工程师 负责某区域的基站维护 某地方有n个基站 1
  • vue中pc端大屏怎么进行rem适配(lib-flexible + postcss-pxtorem)

    使用 插件 lib flexible 和 postcss pxtorem 进行是适配 一共是两个步骤 当我们在进行适配的时候 如果只将当前屏幕分成几份的话 那么在后面写样式的时候 样式的单位需要写成rem 但是这里我们在进行完 postcs
  • 多线程与高并发

    volatile CAS 无锁优化 Unsafe Synchronized volatile CAS Atomic gt CAS LongAdder 使用的分段锁 increment gt Sync Atomic LongAdder Ree
  • ios 微信小程序 chooseImage 相机拍照跳转页面崩溃

    问题描述 功能需求 拍照或选择图片 然后跳转页面裁剪上传头像 一开始使用 chooseImage 本人的小小安卓机和测试的ios手机都是没有问题的 后来同事的 iphone 13 mini 一试拍照跳转页面就崩溃了 一开始一筹莫展还在各处搜
  • angular入门

    架构模式 MVC gt MVP gt MVVM angular cli angular cli angular脚手架 一键构建angular项目 常用指令 ng help 查看所有指令 ng new projectName 创建angula