了解 Angular 开发的内容

简介: 阅读本文,是在你了解 Angular 基本知识的前提下,如果读者还不了解,请前往官网了解。

image.png


一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情


阅读本文,是在你了解 Angular 基本知识的前提下,如果读者还不了解,请前往官网了解。


如果读者有 vue 或者 React 的开发经验,会很好理解接下来讲解的内容~


组件 Component



团队开发都有自己的约定。我们这里约定 app/pages 目录下的组件是页面组件,其页面组件下的 components 是页面组件的私有组件。app/components 是公有组件。


现在我们新建一个用户的列表页面。


mkdir pages 后,直接进入 pages 目录执行 ng generate component user-list 创建用户列表。你会得到下面的目录:


user-list
├── user-list.component.html                          // 页面骨架
├── user-list.component.scss                          // 页面独有样式
├── user-list.component.spec.ts                       // 测试文件
└── user-list.component.ts                            // javascript 文件
复制代码


使用命令行生成组件的好处是,它会自动在 app.module.ts 中声明本组件 UserListComponent,而不需要手动去操作。


如果你重复去新建一个组件,则脚手架不会执行,不用害怕在同一个地方有重复的组件出现


路由 Router



不同的路由,表示你访问不同的页面组件。这在 app-routing.module.ts 中去添加。


首先你要引入页面组件:


import { UserListComponent } from './pages/user-list/user-list.component';
复制代码


之后添加路由:


const routes: Routes = [{
  path: "user-list",
  component: UserListComponent
}];
复制代码


为了方便演示,只保留 app.component.html 内容 <router-outlet></router-outlet>


这样浏览器进入路径 http://localhost:4200/user-list 就可以看到效果了。


image.png


默认的是 history 模式,如果你要改为 hash 模式的话,可以修改 app-routing.module.ts 内容如下:


import { NgModule } from '@angular/core';
import { RouterModule, Routes, PreloadAllModules } from '@angular/router';
import { UserListComponent } from './pages/user-list/user-list.component';
const routes: Routes = [{
  path: "user-list",
  component: UserListComponent
}];
@NgModule({
  imports: [RouterModule.forRoot(
    routes,
    {
      useHash: true,// 使用 hash 模式
      preloadingStrategy: PreloadAllModules
    }
  )],
  exports: [RouterModule]
})
export class AppRoutingModule { }
复制代码


此时,你访问的路由应该是 http://localhost:4200/#/user-list


管道 Pipeline



管道你可以理解为过滤器。用过 vue 的读者应该对这个不默认。


Angular 有默认的管道元件,比如:


  • UpperCase
  • LowerCase
  • Currency 货币
  • PercentPipe
  • DatePipe
  • JsonPipe
  • SlicePipe


使用也很简单:


<p>{{ uppercase_var|uppercase }}</p>
<p>{{ lowercase_var|lowercase }}</p>
<p>{{ currency_var|currency:"CNY":"symbol" }}</p>
<p>{{ percent_var|percent }}</p>
<p>{{ date_var|date:'yyyy-MM-dd HH:mm:ss' }}</p>
<p>{{ json_var|json }}</p>
<p>{{ slice_var|slice:0:9 }}</p>
复制代码


当然,你还可以自定义管道。


我们在 app 目录下 mkdir pipes 文件夹统一管理管道元件。


ng generate pipe get-first-character 命令行创建一个获取第一个字符的管道,也会自动在 app.module.ts 中声明 GetFirstCharacterPipe(驼峰式)管道,很是方便。因为这里的功能比较简单,我们简单修改下 get-first-character.pipe.ts 文件就很满足要求了。


import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'getFirstCharacter'
})
export class GetFirstCharacterPipe implements PipeTransform {
  transform(value: string, ...args: unknown[]): unknown {
    return value.slice(0, 1);
  }
}
复制代码


调用如下:


<p>{{ string_var|getFirstCharacter }}</p>
复制代码


Easy, Right?


指令 Directive



可以理解为指令是对控制器的补充,主要功能是对Dom元素和数据的操作,已有的指令,如:ngModel,这些指令直接到官网上查看就可以了,比较简单。


下面我们说的是自定义的指令。


老样子,我们进入 app 目录,mkdir directives 文件夹统一管理指令。


ng generate directive directive_console 创建一个输出的指令,也会自动在 app.module.ts 中声明 DirectiveConsoleDirective(驼峰式)管道,很是方便。此文件的内容如下:


import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
  selector: '[appDirectiveConsole]'
})
export class DirectiveConsoleDirective {
  constructor(
    public elementRef: ElementRef
  ) { }
  @HostListener('keyup', ['$event.target'])
  keyupFunction(event: any) {
    if(event.value) {
      console.log(this.elementRef)
      this.elementRef.nativeElement.value = event.value.trim()
    }
  }
}
复制代码


我们在 user-list.component.html 中新增:


<input type="text" id="name" appDirectiveConsole>
复制代码


那么会有下面这种效果:


image.png


后面的章节会展开说指令


服务 Service



服务,你可以理解为请求 api 的地方,那也不错,但是不仅仅有这么个用处,在后面的章节会展开说。


那么我们把它当成处理 api 的地方吧。


进入 app 目录,mkdir services 文件夹统一管理服务。


ng generate service service_demo 创建一个 demo 数据的服务。


我们在 assets 文件夹下创建一个 demo.json 文件:


{
  "name": "Jimmy"
}
复制代码


下面我们对 service-demo.service.ts 进行方法的编写,通过 http 获取 demo.json 数据。


import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
  providedIn: 'root'
})
export class ServiceDemoService {
  constructor(
    private http: HttpClient
  ) { }
  // 获取 demo.json 数据
  getDemo() {
    return this.http.get('assets/demo.json', {
      responseType: 'json',
      params: {}
    })
  }
}
复制代码


之后,我们在 user-list.component.ts 文件中调用下:


import { Component, OnInit } from '@angular/core';
import { ServiceDemoService } from 'src/app/services/service-demo.service';
@Component({
  selector: 'app-user-list',
  templateUrl: './user-list.component.html',
  styleUrls: ['./user-list.component.scss']
})
export class UserListComponent implements OnInit {
  public name:string = '';
  constructor(
    private demoService: ServiceDemoService
  ) { }
  ngOnInit(): void {
    this.demoService.getDemo().subscribe({
      next: (data: any) => {
        this.name = data.name
      },
      error: () => {}
    })
  }
}
复制代码


上面用到了 http 的相关服务,你必须在 app.module.ts 中引入其模块才行的哦。


import { HttpClientModule } from '@angular/common/http';
// ...
@NgModule({
  imports: [
    HttpClientModule
  ],
  //...
})
复制代码


运行之后,如下图:


image.png


嗯~


整体熟悉下来,你想基本 holdangular 开发单页面系统,还需要你在官网中看下基本的语法,毕竟基本的语法在这里也没什么好说的。



相关文章
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
42 0
|
3月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
65 0
|
3月前
|
前端开发 安全 开发者
JSF文件上传,让Web应用如虎添翼!一招实现文件上传,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,文件上传是重要功能之一。JSF(JavaServer Faces)框架提供了强大的文件上传支持,简化了开发流程。本文将介绍JSF文件上传的基本步骤:创建前端表单、处理上传文件的后端Action类、将文件保存到服务器指定目录以及返回结果页面。通过示例代码,我们将展示如何利用JSF实现文件上传功能,包括使用`h:inputFile`控件和`ManagedBean`处理上传逻辑。此外,JSF文件上传还具备类型安全、解耦合和灵活性等优点,有助于提升程序的健壮性和可维护性。
37 0
|
3月前
|
开发者 Java 存储
JSF 与 CDI 携手共进,紧跟技术热点,激发开发者情感共鸣,开启高效开发新征程
【8月更文挑战第31天】JavaServer Faces (JSF) 与 Contexts and Dependency Injection (CDI) 在 Java EE 领域中紧密协作,助力开发者高效构建现代 Web 应用。JSF 凭借其丰富的组件库和页面导航功能受到青睐,而 CDI 则优雅地管理对象生命周期并实现依赖注入。两者结合,不仅简化了复杂企业应用的开发,还实现了松耦合架构,增强了代码的灵活性、可维护性和可扩展性。通过示例展示了如何利用 CDI 将业务服务对象注入 JSF Managed Bean,以及如何在不同页面间共享数据,突显了这一组合的强大功能。
38 0
|
3月前
|
前端开发 API 开发者
JSF与RESTful服务的完美邂逅:如何打造符合现代Web潮流的数据交互新体验
【8月更文挑战第31天】随着互联网技术的发展,RESTful架构风格因其实现简便与无状态特性而在Web服务构建中日益流行。本文探讨如何结合JavaServer Faces (JSF) 和 JAX-RS 构建RESTful API,展示从前端到后端分离的完整解决方案。通过定义资源类、配置 `web.xml` 文件以及使用依赖注入等步骤,演示了在JSF项目中实现RESTful服务的具体过程,为Java开发者提供了实用指南。
40 0
|
3月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
44 0
|
6月前
|
JavaScript 前端开发 开发者
【TypeScript技术专栏】TypeScript在Angular开发中的应用
【4月更文挑战第30天】本文探讨了TypeScript在Angular开发中的应用。Angular与TypeScript的结合利用了静态类型检查和ECMAScript特性,简化了大型Web应用的开发。文章涵盖组件、数据绑定、依赖注入、服务、守卫和路由以及模块化等方面,展示了如何在Angular中有效使用TypeScript。此外,还提到了TypeScript的高级应用,如泛型、高级类型和装饰器。掌握这些知识将有助于提升Angular应用的可维护性和可扩展性。
66 0
|
开发框架 前端开发 JavaScript
推荐一个前后端分离.NetCore+Angular快速开发框架
推荐一个前后端分离.NetCore+Angular快速开发框架
111 0
|
XML Web App开发 前端开发
使用VScode开发Angular
使用VScode开发Angular
973 0
使用VScode开发Angular
|
JavaScript 前端开发 测试技术
angular框架怎么从0到1进行开发
angular框架怎么从0到1进行开发
61 0