」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 角管:綜合指南

角管:綜合指南

發佈於2024-11-06
瀏覽:935

Angular 中的

Angular Pipes: A Comprehensive guide

Pipes 是简单的函数,用于在不修改底层数据的情况下转换模板中的数据。管道接收一个值,对其进行处理,然后返回格式化或转换后的输出。它们通常用于格式化日期、数字、字符串,甚至数组或对象。

它们允许您直接在视图中以更具可读性或相关性的格式格式化和显示数据,而无需更改底层数据模型。

使用管道有助于保持代码干净可读。您可以将该逻辑封装在 pipe 中,然后可以在应用程序的不同部分中重用,而不是在模板或组件中编写复杂的逻辑。
例如,如果您正在开发一个博客平台,用户可以在其中查看文章的发布日期。日期需要以用户友好的格式显示,例如“2024 年 8 月 31 日”,而不是原始格式“2024–08–31T14:48:00.000Z”。借助 pipes,您可以在模板中使用 Angular 内置的 DatePipe,而不是在组件中手动格式化日期,这样会使代码变得混乱并降低可读性。

Published on: {{ article.publishDate | date:'longDate' }}

要应用管道,请在模板表达式中使用 管道 运算符 (|),如上面的代码示例所示。

内置管道

Angular 附带了几个涵盖常见任务的内置管道(DatePipe、UpperCasePipe、LowerCasePipe、CurrencyPipe、AsyncPipe、JsonPipe、 等)。知道如何使用这些可以让你的代码更干净、更高效。

示例:

{{ user | json }}

Price: {{ product.price | currency:'USD' }}

{{ user.name | uppercase }}

价格:{{ 产品.价格 |货币:'USD' }}

{{ 用户名 |大写 }}

参数化管道

许多 Angular 管道接受参数来自定义其行为。

要指定参数,请在管道名称后添加冒号 (:) 和参数值

一些管道接受多个参数,这些参数由附加冒号分隔。

参数可以是可选必需。假设您有一个格式化货币的自定义管道,并要求您指定货币类型作为参数。如果未提供此参数,管道可能无法正确格式化该值。

The product price is {{ price | customCurrency:'USD' }}

1.带参数的 DatePipe

Published on: {{ article.publishDate | date:'MMMM d, y, h:mm:ss a' }}

这将日期格式设置为“2024 年 8 月 31 日,下午 2:48:00”。

2.带参数的CurrencyPipe

Price: {{ product.price | currency:'EUR':'symbol-narrow':'1.0-0' }}

这将价格格式化为“€1,235”(四舍五入到没有小数位)。

链接管道

您可以将多个管道链接在一起以实现复杂的转换。

{{ article.content | slice:0:100 | uppercase }}

这将分割 article.content 的前 100 个字符并将它们转换为大写。

定制管道

有时,内置管道可能无法满足您的特定需求,您需要创建自定义管道来处理特定逻辑。以下是您可以如何做到的。

例子:

在下面的示例中,我们将创建一个管道,将问候语添加到诸如“Hello, Alice!”之类的名称中

运行以下命令生成新管道:

ng generate pipe greet

现在,让我们修改 src/app 目录中的greet.pipe.ts 文件以包含管道逻辑:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'greet',  // This is the name you'll use in the template
  standalone: true,
})
export class GreetPipe implements PipeTransform {
  transform(value: string): string {
    return `Hello, ${value}!`;  // This is the transformation logic
  }
}

管道准备好后,您可以在模板中使用它。

{{ 'Alice' | greet }}

创建参数化自定义管道

现在我们要自定义问候语,这样您就可以说“嗨,爱丽丝!”或“欢迎,爱丽丝!”取决于您传递给管道的内容。

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'greet',  // Same pipe name as before
  standalone: true,
})
export class GreetPipe implements PipeTransform {
  transform(value: string, greeting: string = 'Hello'): string {
    return `${greeting}, ${value}!`;  // Now it uses the greeting passed in
  }
}

transform 方法现在有第二个参数,greeting。如果没有提供问候语,则默认为“Hello”。

现在您可以在模板中自定义问候语。

{{ 'Alice' | greet:'Hi' }}

{{ 'Bob' | greet:'Welcome' }}

纯净管道与不纯净管道

1.纯管道
默认情况下,所有 Angular 管道都是 pure纯管道仅在输入数据(如数字或字符串)或对对象的引用(如数组或日期)更改时被调用。这使得纯管道高效且高性能,因为管道不会不必要地运行。

但是,如果您的数据更复杂,例如项目数组,Angular 可能不会注意到数组内部的更改(例如添加新项目),因为对数组的引用没有更改。

除非必要,请保持管道纯净以避免不必要的重新渲染并保持性能。

例子:

@Pipe({
  name: "onSale",
  standalone: true,
  pure: true,
})
export class OnSalePipe implements PipeTransform {
  transform(items: Item[]): Item[] {
    return items.filter((item) => item.isOnSale);
  }
}

在您的模板中:

  • {{ item.name }} - {{ item.price | formatPrice }}

如果您将新商品添加到正在促销的 items 数组中,您可能希望它出现在列表中。但是,如果您只是将新项目推入数组,列表可能不会更新,因为数组引用没有更改。

2、管道不纯

另一方面,不纯管道每次 Angular 执行变化检测周期时都会被调用。但是,由于它们运行如此频繁,因此可能会减慢您的应用程序的速度。

例子:

@Pipe({
  name: "onSaleImpure",
  standalone: true,
  pure: false,
})
export class OnSaleImpurePipe implements PipeTransform {
  transform(items: Item[]): Item[] {
    return items.filter((item) => item.isOnSale);
  }
}

在您的模板中:

  • {{ item.name }} - {{ item.price | formatPrice }}

现在,当您添加新项目时,管道将注意到更改并更新列表。

使用管道的最佳实践

  1. 保持管道简单。避免管道中的繁重计算

  2. 清晰且描述性地命名管道

  3. 让管道专注于单一职责

  4. 尽可能避免使用不纯的管道

  5. 彻底测试定制管道

结论

Angular pipes 简化数据转换任务,使您的代码更加模块化、可重用和可维护。它们有助于增强整个应用程序的一致性并提高模板的可读性,这对于开发可扩展和可维护的应用程序至关重要。

版本聲明 本文轉載於:https://dev.to/bytebantz/angular-pipes-a-comprehensive-guide-h5g?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-03-28
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-03-28
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-03-28
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-03-28
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-03-28
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-03-28
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-03-28
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-03-28
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-03-28
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-03-28
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-03-28
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-03-28
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-03-28
  • 為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    程式設計 發佈於2025-03-28
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-03-28

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3