Heim > Web-Frontend > js-Tutorial > Hauptteil

Angular verwendet einen Dienst, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung).

青灯夜游
Freigeben: 2022-04-29 21:12:04
nach vorne
2534 Leute haben es durchsucht

Dieser Artikel wird Ihnen dabei helfen, Angular weiter zu lernen und zu erfahren, wie Angular Dienste nutzt, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung). Ich hoffe, dass er für alle hilfreich ist!

Angular verwendet einen Dienst, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung).

Im vorherigen Artikel haben wir Folgendes erwähnt:

Der Dienst kann nicht nur zur Verarbeitung von API-Anfragen verwendet werden, sondern hat auch andere Verwendungszwecke.

Zum Beispiel die -Benachrichtigung, über die wir in diesem Artikel sprechen werden Implementierung. [Verwandte Tutorial-Empfehlungen: „notification 的实现。【相关教程推荐:《angular教程》】

效果图如下:

Angular verwendet einen Dienst, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung).

UI 这个可以后期调整

So,我们一步步来分解。

添加服务

我们在 app/services 中添加 notification.service.ts 服务文件(请使用命令行生成),添加相关的内容:

// 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() { }
}
Nach dem Login kopieren

是不是很容易理解...

我们将 notify 变成可观察物体,之后发布各种状态的信息。

创建组件

我们在 app/components 这个存放公共组件的地方新建 notification 组件。所以你会得到下面的结构:

notification                                          
├── notification.component.html                     // 页面骨架
├── notification.component.scss                     // 页面独有样式
├── notification.component.spec.ts                  // 测试文件
└── notification.component.ts                       // javascript 文件
Nach dem Login kopieren

我们定义 notification 的骨架:

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

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

接着,我们简单修饰下骨架,添加下面的样式:

// 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 {}
}
Nach dem Login kopieren

success, progress, failure, ended 这四个类名对应 notification service 定义的枚举,可以按照自己的喜好添加相关的样式。

最后,我们添加行为 javascript 代码。

// 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()
  }

}
Nach dem Login kopieren

在这里,我们引入了 rxjs 这个知识点,RxJS 是使用 Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易。这是一个很棒的库,接下来的很多文章你会接触到它更多的内容。

这里我们使用了 debounce 防抖函数,函数防抖,就是指触发事件后,在 n 秒后只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数的执行时间。简单来说:当一个动作连续触发,只执行最后一次。

ps: throttle 节流函数:限制一个函数在一定时间内只能执行一次

在面试的时候,面试官很喜欢问...

调用

因为这个一个全局的服务,我们在 app.component.html 中调用此组件:

// app.component.html

<router-outlet></router-outlet>
<app-notification></app-notification>
Nach dem Login kopieren

为了方便演示,我们在 user-list.component.html 中添加按钮,方便触发演示:

// user-list.component.html

<button (click)="showNotification()">click show notification</button>
Nach dem Login kopieren

触发相关的代码:

// 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)
}
Nach dem Login kopieren

至此,大功告成,我们成功模拟了 notificationAngular-Tutorial

“]

Das Rendering ist wie folgt:

Angular verwendet einen Dienst, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung).🎜🎜🎜Benutzeroberfläche Dies kann später angepasst werden🎜🎜🎜Also, lasst uns es Schritt für Schritt aufschlüsseln. 🎜🎜Dienst hinzufügen🎜🎜Wir fügen notification.service in <code>app/services hinzu. ts-Dienstdatei (zum Generieren bitte die Befehlszeile verwenden), relevanten Inhalt hinzufügen: 🎜rrreee🎜Ist das nicht leicht zu verstehen...🎜🎜Wir werden notify in ein Observable umwandeln Objekt, dann verschiedene Statusinformationen veröffentlichen. 🎜🎜Komponente erstellen🎜🎜Wir erstellen eine neue app/components, in der öffentliche Komponenten gespeichert werdennotification-Komponente. Sie erhalten also die folgende Struktur: 🎜rrreee🎜Wir definieren das Grundgerüst der Benachrichtigung: 🎜rrreee🎜Dann modifizieren wir einfach das Grundgerüst und fügen den folgenden Stil hinzu: 🎜rrreee🎜Erfolg, Fortschritt , Fehler, beendet Diese vier Klassennamen entsprechen der vom Benachrichtigungsdienst definierten Aufzählung. Sie können verwandte Stile entsprechend Ihren eigenen Vorlieben hinzufügen. 🎜🎜Schließlich fügen wir den verhaltensbezogenen Javascript-Code hinzu. 🎜rrreee🎜Hier stellen wir den Wissenspunkt von rxjs vor, einer reaktiven Programmierbibliothek, die Observables verwendet, was das Schreiben asynchron macht Oder Rückruf basierte Code ist einfacher. Dies ist eine großartige Bibliothek, und Sie werden in den nächsten Artikeln mehr darüber erfahren. 🎜🎜Hier verwenden wir die Anti-Shake-Funktion debounce, die bedeutet, dass ein Ereignis nach dem Auslösen nur einmal ausgeführt werden kann Innerhalb von n Sekunden wird die Ausführungszeit der Funktion neu berechnet. Vereinfacht ausgedrückt: Wenn eine Aktion kontinuierlich ausgelöst wird, wird nur das letzte Mal ausgeführt. 🎜🎜🎜ps: throttle Drosselfunktion: Beschränken Sie die Ausführung einer Funktion nur einmal innerhalb eines bestimmten Zeitraums. 🎜🎜🎜Während des Interviews fragt der Interviewer gerne...🎜🎜Anruf🎜🎜Denn es handelt sich um einen globalen Service , rufen wir diese Komponente in app.component.html auf: 🎜rrreee🎜Um die Demonstration zu erleichtern, fügen wir in user-list.component.html eine Schaltfläche zum einfachen Auslösen der Demo hinzu: 🎜rrreee🎜Trigger-bezogener Code: 🎜rrreee🎜An diesem Punkt sind wir fertig und haben die Funktion der Benachrichtigung erfolgreich simuliert. Wir können zugehörige Servicekomponenten je nach tatsächlichem Bedarf modifizieren und an die Geschäftsanforderungen anpassen. Wenn wir ein System für den internen Gebrauch entwickeln, empfiehlt es sich, ausgereifte UI-Bibliotheken zu verwenden. Sie haben uns dabei geholfen, verschiedene Komponenten und Dienste zu kapseln, was uns viel Entwicklungszeit spart. 🎜🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Einführung in die Programmierung🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonAngular verwendet einen Dienst, um benutzerdefinierte Dienste zu implementieren (Benachrichtigung).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!