Artık sinyalleri servislerle kullanmayı öğrendiğinize göre, direktiflerin sinyalleri nasıl kullandığını keşfedelim. Harika haber: sinyaller direktiflerde bileşenlerdeki gibi tamamen aynı şekilde çalışır! Temel fark, direktiflerin şablonları olmadığı için, sinyalleri ağırlıklı olarak ana eleman (host element) üzerinde reaktif güncellemeler yapmak için host bağlamalarında kullanacak olmanızdır.
Bu aktivitede, sinyallerin direktiflerde nasıl reaktif davranış oluşturduğunu gösteren bir vurgulama direktifi oluşturacaksınız.
-
Sinyalleri tıpkı bir bileşendeki gibi kurun
Sinyal fonksiyonlarını içe aktarın ve reaktif durumunuzu oluşturun. Bu, bileşenlerdeki ile tamamen aynı şekilde çalışır:
import {Directive, input, signal, computed} from '@angular/core'; @Directive({ selector: '[highlight]', }) export class HighlightDirective { // Signal inputs - same as components! color = input<string>('yellow'); intensity = input<number>(0.3); // Internal state - same as components! private isHovered = signal(false); // Computed signals - same as components! backgroundStyle = computed(() => { const baseColor = this.color(); const alpha = this.isHovered() ? this.intensity() : this.intensity() * 0.5; const colorMap: Record<string, string> = { 'yellow': `rgba(255, 255, 0, ${alpha})`, 'blue': `rgba(0, 100, 255, ${alpha})`, 'green': `rgba(0, 200, 0, ${alpha})`, 'red': `rgba(255, 0, 0, ${alpha})`, }; return colorMap[baseColor] || colorMap['yellow']; }); }Bunun bileşen kalıplarıyla aynı olduğuna dikkat edin - tek fark
@Componentyerine@Directiveiçinde olmamızdır. -
Sinyalleri host bağlamalarında kullanın
Direktiflerin şablonları olmadığı için, sinyalleri ana elemanı reaktif olarak güncellemek için host bağlamalarında kullanacaksınız.
hostyapılandırmasını ve olay işleyicilerini ekleyin:@Directive({ selector: '[highlight]', host: { '[style.backgroundColor]': 'backgroundStyle()', '(mouseenter)': 'onMouseEnter()', '(mouseleave)': 'onMouseLeave()', }, }) export class HighlightDirective { // ... signals from previous step ... onMouseEnter() { this.isHovered.set(true); } onMouseLeave() { this.isHovered.set(false); } }Host bağlamaları, sinyaller değiştiğinde otomatik olarak yeniden değerlendirilir - tıpkı bileşenlerdeki şablon bağlamaları gibi!
isHovereddeğiştiğinde,backgroundStylecomputed sinyali yeniden hesaplanır ve host bağlaması elemanın stilini günceller. -
Direktifi şablonunuzda kullanın
Reaktif direktifi göstermek için uygulama şablonunu güncelleyin:
template: ` <div> <h1>Directive with Signals</h1> <div highlight color="yellow" [intensity]="0.2">Hover me - Yellow highlight</div> <div highlight color="blue" [intensity]="0.4">Hover me - Blue highlight</div> <div highlight color="green" [intensity]="0.6">Hover me - Green highlight</div> </div> `,Direktif, sinyal input'larına göre otomatik olarak reaktif vurgulama uygular!
Mükemmel! Artık sinyallerin direktiflerle nasıl çalıştığını gördünüz. Bu dersten bazı önemli çıkarımlar:
- Sinyaller evrenseldir - Tüm sinyal API'leri (
input(),signal(),computed(),effect()) hem direktiflerde hem de bileşenlerde aynı şekilde çalışır - Host bağlamaları birincil kullanım alanıdır - Direktiflerin şablonları olmadığı için, ana elemanı reaktif olarak değiştirmek için sinyalleri host bağlamalarında kullanırsınız
- Aynı reaktif kalıplar - Sinyal güncellemeleri, bileşen şablonlarında olduğu gibi computed sinyallerin ve host bağlamalarının otomatik yeniden değerlendirilmesini tetikler
Bir sonraki derste, sinyal sorguları ile alt elemanları nasıl sorgulayacağınızı öğreneceksiniz!