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

角管:綜合指南

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

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]刪除
最新教學 更多>
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-05-05
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-05-05
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-05-05
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-05-05
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。要簡化過程,建議將JSON作為數組而不是對象解析。 執行此操作,將JSON_DECODE函數與第二個參數設置為true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ ...
    程式設計 發佈於2025-05-05
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-05-05
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-05-05
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-05-05
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-05-05
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-05
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-05-05
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-05-05
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-05
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-05-05

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

Copyright© 2022 湘ICP备2022001581号-3