Angular menggunakan perkhidmatan untuk melaksanakan perkhidmatan tersuai (pemberitahuan)

青灯夜游
Lepaskan: 2022-04-29 21:12:04
ke hadapan
2535 orang telah melayarinya

Artikel ini akan membantu anda meneruskan pembelajaran angular dan mempelajari cara Angular menggunakan perkhidmatan untuk melaksanakan perkhidmatan tersuai (pemberitahuan).

Angular menggunakan perkhidmatan untuk melaksanakan perkhidmatan tersuai (pemberitahuan)

Dalam artikel sebelumnya, kami menyebut:

perkhidmatan bukan sahaja boleh digunakan untuk memproses permintaan API, tetapi juga mempunyai kegunaan lain

Sebagai contoh, pelaksanaan notification yang akan kita bincangkan dalam artikel ini. [Tutorial berkaitan yang disyorkan: "tutorial sudut"] Paparan

adalah seperti berikut:

Angular menggunakan perkhidmatan untuk melaksanakan perkhidmatan tersuai (pemberitahuan)

UI Ini boleh diselaraskan kemudian

Jadi, mari kita pecahkan langkah demi langkah.

Tambah perkhidmatan

Kami menambah app/services fail perkhidmatan dalam notification.service.ts (sila gunakan baris arahan untuk menjananya) dan tambah kandungan berkaitan :

// notification.service.ts

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

// 通知状态的枚举
export enum NotificationStatus {
  Process = "progress",
  Success = "success",
  Failure = "failure",
  Ended = "ended"
}

@Injectable({
  providedIn: 'root'
})
export class NotificationService {

  private notify: Subject<NotificationStatus> = new Subject();
  public messageObj: any = {
    primary: &#39;&#39;,
    secondary: &#39;&#39;
  }

  // 转换成可观察体
  public getNotification(): Observable<NotificationStatus> {
    return this.notify.asObservable();
  }

  // 进行中通知
  public showProcessNotification() {
    this.notify.next(NotificationStatus.Process)
  }

  // 成功通知
  public showSuccessNotification() {
    this.notify.next(NotificationStatus.Success)
  }

  // 结束通知
  public showEndedNotification() {
    this.notify.next(NotificationStatus.Ended)
  }

  // 更改信息
  public changePrimarySecondary(primary?: string, secondary?: string) {
    this.messageObj.primary = primary;
    this.messageObj.secondary = secondary
  }

  constructor() { }
}
Salin selepas log masuk

Bukankah mudah difahami...

Kami menukar notify menjadi objek yang boleh diperhatikan, dan kemudian menerbitkan pelbagai maklumat status.

Buat komponen

Kami mencipta komponen app/components baharu dalam notification tempat komponen awam disimpan. Jadi anda akan mendapat struktur berikut:

notification                                          
├── notification.component.html                     // 页面骨架
├── notification.component.scss                     // 页面独有样式
├── notification.component.spec.ts                  // 测试文件
└── notification.component.ts                       // javascript 文件
Salin selepas log masuk

Kami mentakrifkan rangka notification:

<!-- notification.component.html -->

<!-- 支持手动关闭通知 -->
<button (click)="closeNotification()">关闭</button>
<h1>提醒的内容: {{ message }}</h1>
<!-- 自定义重点通知信息 -->
<p>{{ primaryMessage }}</p>
<!-- 自定义次要通知信息 -->
<p>{{ secondaryMessage }}</p>
Salin selepas log masuk

Seterusnya, kami hanya mengubah suai rangka dan menambah gaya berikut:

// notification.component.scss

:host {
  position: fixed;
  top: -100%;
  right: 20px;
  background-color: #999;
  border: 1px solid #333;
  border-radius: 10px;
  width: 400px;
  height: 180px;
  padding: 10px;
  // 注意这里的 active 的内容,在出现通知的时候才有
  &.active {
    top: 10px;
  }
  &.success {}
  &.progress {}
  &.failure {}
  &.ended {}
}
Salin selepas log masuk

success, progress, failure, ended Empat nama kelas ini sepadan dengan penghitungan yang ditakrifkan oleh perkhidmatan pemberitahuan Anda boleh menambah gaya berkaitan mengikut pilihan anda sendiri.

Akhir sekali, kami menambah kod javascript gelagat.

// notification.component.ts

import { Component, OnInit, HostBinding, OnDestroy } from &#39;@angular/core&#39;;
// 新的知识点 rxjs
import { Subscription } from &#39;rxjs&#39;;
import {debounceTime} from &#39;rxjs/operators&#39;;
// 引入相关的服务
import { NotificationStatus, NotificationService } from &#39;src/app/services/notification.service&#39;;

@Component({
  selector: &#39;app-notification&#39;,
  templateUrl: &#39;./notification.component.html&#39;,
  styleUrls: [&#39;./notification.component.scss&#39;]
})
export class NotificationComponent implements OnInit, OnDestroy {
  
  // 防抖时间,只读
  private readonly NOTIFICATION_DEBOUNCE_TIME_MS = 200;
  
  protected notificationSubscription!: Subscription;
  private timer: any = null;
  public message: string = &#39;&#39;
  
  // notification service 枚举信息的映射
  private reflectObj: any = {
    progress: "进行中",
    success: "成功",
    failure: "失败",
    ended: "结束"
  }

  @HostBinding(&#39;class&#39;) notificationCssClass = &#39;&#39;;

  public primaryMessage!: string;
  public secondaryMessage!: string;

  constructor(
    private notificationService: NotificationService
  ) { }

  ngOnInit(): void {
    this.init()
  }

  public init() {
    // 添加相关的订阅信息
    this.notificationSubscription = this.notificationService.getNotification()
      .pipe(
        debounceTime(this.NOTIFICATION_DEBOUNCE_TIME_MS)
      )
      .subscribe((notificationStatus: NotificationStatus) => {
        if(notificationStatus) {
          this.resetTimeout();
          // 添加相关的样式
          this.notificationCssClass = `active ${ notificationStatus }`
          this.message = this.reflectObj[notificationStatus]
          // 获取自定义首要信息
          this.primaryMessage = this.notificationService.messageObj.primary;
          // 获取自定义次要信息
          this.secondaryMessage = this.notificationService.messageObj.secondary;
          if(notificationStatus === NotificationStatus.Process) {
            this.resetTimeout()
            this.timer = setTimeout(() => {
              this.resetView()
            }, 1000)
          } else {
            this.resetTimeout();
            this.timer = setTimeout(() => {
              this.notificationCssClass = &#39;&#39;
              this.resetView()
            }, 2000)
          }
        }
      })
  }

  private resetView(): void {
    this.message = &#39;&#39;
  }
  
  // 关闭定时器
  private resetTimeout(): void {
    if(this.timer) {
      clearTimeout(this.timer)
    }
  }

  // 关闭通知
  public closeNotification() {
    this.notificationCssClass = &#39;&#39;
    this.resetTimeout()
  }
  
  // 组件销毁
  ngOnDestroy(): void {
    this.resetTimeout();
    // 取消所有的订阅消息
    this.notificationSubscription.unsubscribe()
  }

}
Salin selepas log masuk

Di sini, kami memperkenalkan titik pengetahuan rxjs RxJS ialah perpustakaan pengaturcaraan reaktif menggunakan Observables, yang membolehkan menulis kod berasaskan tak segerak atau Panggilan Balik. adalah lebih mudah. Ini adalah perpustakaan yang hebat, dan anda akan mengetahui lebih lanjut mengenainya dalam artikel akan datang.

Di sini kita menggunakan fungsi anti goncang debounce Fungsi anti goncang bermakna selepas peristiwa dicetuskan, ia hanya boleh dilaksanakan sekali selepas n saat dalam masa n saat, maka Masa pelaksanaan fungsi akan dikira semula. Ringkasnya: apabila tindakan dicetuskan secara berterusan, hanya kali terakhir dilaksanakan.

ps:

Fungsi pendikit: throttleHadkan fungsi untuk dilaksanakan sekali sahaja dalam tempoh masa tertentu.

Semasa temuduga, penemuduga suka bertanya...

Hubungi

kerana yang ini Untuk perkhidmatan global, kami memanggil komponen ini dalam

: app.component.html

// app.component.html

<router-outlet></router-outlet>
<app-notification></app-notification>
Salin selepas log masuk
Untuk memudahkan demonstrasi, kami menambah butang dalam

untuk mencetuskan demonstrasi dengan mudah: user-list.component.html

// user-list.component.html

<button (click)="showNotification()">click show notification</button>
Salin selepas log masuk
pencetus Kod yang berkaitan:

// user-list.component.ts

import { NotificationService } from &#39;src/app/services/notification.service&#39;;

// ...
constructor(
  private notificationService: NotificationService
) { }

// 展示通知
showNotification(): void {
  this.notificationService.changePrimarySecondary(&#39;主要信息 1&#39;);
  this.notificationService.showProcessNotification();
  setTimeout(() => {
    this.notificationService.changePrimarySecondary(&#39;主要信息 2&#39;, &#39;次要信息 2&#39;);
    this.notificationService.showSuccessNotification();
  }, 1000)
}
Salin selepas log masuk
Pada ketika ini, kami telah selesai, kami telah berjaya mensimulasikan fungsi

. Kami boleh mengubah suai komponen perkhidmatan yang berkaitan mengikut keperluan sebenar dan menyesuaikannya untuk memenuhi keperluan perniagaan. Jika kami sedang membangunkan sistem untuk kegunaan dalaman, adalah disyorkan untuk menggunakan perpustakaan UI yang matang. Ia telah membantu kami merangkum pelbagai komponen dan perkhidmatan, menjimatkan banyak masa pembangunan. notification

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:

Pengenalan kepada Pengaturcaraan! !

Atas ialah kandungan terperinci Angular menggunakan perkhidmatan untuk melaksanakan perkhidmatan tersuai (pemberitahuan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!