iT邦幫忙

1

計算訊號 - 快取錯誤 and Equal 函數不追蹤訊號

  • 分享至 

  • xImage
  •  

計算訊號快取錯誤

計算訊號中的錯誤快取是 Angular 19.1.2 中的新功能。當 equal 函數拋出錯誤時,計算訊號會快取該錯誤。當讀取該值時,計算訊號會拋出錯誤,從而停止 computedequal 函數的重新運行。

HTML 模板顯示計算訊號的最後一個成功值,直到錯誤清除。當 computed 函數和 equal 函數重新運行時沒有錯誤,計算訊號將清除錯誤。

由於計算訊號會拋出快取錯誤,因此依賴它的訊號直到錯誤清除後才會更新。

badLuck = signal(0);
numBadNumberRun = 0;
numBadNumberEqualRun = 0;
badLuckComputed = computed (() => {
   this.numBadNumberRun = this.numBadNumberRun + 1;
   return this.badLuck();
}, {
   equal: (_, b) => {
     this.numBadNumberEqualRun = this.numBadNumberEqualRun + 1;
     if ([4, 14, 24, 44].includes(b)) {
       throw new Error("Bad number thrown");
     }
     return false;
 }});


incrementBadLuck() {
   this.badLuck.update((prev) => prev + 1);
}
<p>Bad Luck computed: {{ badLuckComputed() }}, Number of executions: {{ numBadNumberRun }}, Number of equal executions: {{ numBadNumberEqualRun }}</p>
<hr />

badLuck 是一個儲存整數的訊號。當使用者點擊按鈕時,訊號增加1。 badLuckComputed 是一個傳回 badLuck 值的計算訊號。當 badLuck 不幸時,equal 函數會拋出錯誤,並且 badLuckComputed 計算訊號會將其快取。例如,badLuckComputedbadLuck 為 4 時快取錯誤,HTML 模板顯示 badLuck(4)和 badLuckComputed(3)。 當使用者點擊按鈕時,badLuck 變成 5,equal 函數傳回 false 而不是錯誤。 badLuckComputed 的錯誤被清除,並且 badLuckbadLuckComputed 都顯示 5。

sumOfLuck = computed(() => this.badLuckComputed() + this.count())

sumOfLuck 是計算訊號,等於 badLuckComputedcount 訊號的總和。 當任何一個訊號改變時,sumOfLuck 計算訊號會得到一個新值,除非 badLuckComputed 訊號快取了錯誤。

sumOfLuck 的計算函數運行時,badLuckComputed 計算訊號會拋出錯誤,且訊號不會更新。 當 count 訊號更新時也會發生同樣的事情。 sumOfLuckcomputed 函數評估 badLuckComputed,並拋出錯誤。因此,sumOfLuck 計算訊號不會更新。

badLuckComputed 計算訊號更新時,它會清除錯誤。 sumOfLuckcomputed 函數運行並評估 badLuckComputedcount 訊號。 函數在執行時間沒有錯誤,且 sumOfLuck 計算訊號儲存新的總數。

Equal 函數不追蹤訊號

equal 函數不追蹤訊號。假設組件其他部分修改訊號值;computedequal 函數不會重新運行。 當追蹤的訊號導致 computedequal 函數重新運行時,新的訊號值有效。

此示範計算原始文字和新文字之間的相似度得分。當兩個文字相似時,upperSimilarText 的計算訊號會以大寫形式顯示新文字。 equal 函數呼叫 javascript 函式庫來計算分數並與 minSimilaryScore 訊號進行比較。 使用者點擊按鈕可以將 minSimilarityScore 減少或增加 0.05。當 minSimilarityScore 訊號透過按鈕點選更新時,upperSimilarText 計算訊號不會重新運作。

安裝 dependency

npm install string-similarity-js	

安裝 string-similarity-js 比較兩個字串並傳回相似度分數。

getSimilarScore(b: string) {
   return stringSimilarity(this.originalText, b);
}

minSimilarityScore = signal(0.5);
readonly originalText = 'The quick brown fox jumps over the lazy dog';
readonly delta = 0.05;
text = signal(this.originalText);
score = computed(() => this.getSimilarScore(this.text()));
<div>
  <input style="width: 100%;" [(ngModel)]="text" />
</div>
<div>score: {{ score() }}</div>

模板有一個輸入字段,新文字儲存在 text 訊號,並將相似度分數儲存在 score 計算訊號中。。

modify(amount: number) {
   this.minSimilarityScore.update((prev) => Math.max(0, Math.min(1, prev + amount)));
}
<button (click)="modify(-delta)">Reduce the minimum similarity score by {{ delta }}</button>
<button (click)="modify(delta)">Add the minimum similarity score by {{ delta }}</button> 

當使用者點擊按鈕時,minSimilarityScore 訊號會增加或減少0.05。

upperSimilarText = computed(() => { 
   this.numComputedRun = this.numComputedRun + 1;
   return this.text().toUpperCase();
}, {
   equal: (_, b) => { 
    this.numEqualRun = this.numEqualRun + 1;
    this.getSimilarScore(b) <  this.minSimilarityScore();
}});
<div>
   <p>{{ upperSimilarText() }}</p>
   <p>numComputedRun: {{ numComputedRun }}, numEqualRun: {{ numEqualRun }}</p>
</div>

當使用者在文字方塊中輸入新文字時,scorecomputed 函數會重新運行以計算新的相似度分數。當相似度分數小於 minSimilarityScore 的值時,upperSimilarTextcomputed 函數也會重新運行並更新。

當使用者點擊按鈕來改變 minSimilarityScore 的值時,upperSimilarText 不會重新運行,因為其 equal 函數不會追蹤訊號。當使用者在文字方塊中輸入新文字時,upperSimilarText 計算訊號會重新運行並在 equal 函數中使用 minSimilarityScore 訊號的新值。

以上就是我對計算訊號的錯誤快取與 equal 函數中追蹤訊號的分享。

參考:


.
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言