2015-12-07 10 views
29

Bir direktif var için gönderilen nesne değiştirilebilir ve üzerine bir sınıf kabul eden @Input olduğunu.angular2 olarak, nasıl özellikleri için onChanges bir @Input

@Directive({selector: 'my-directive'}) 
@View({directives: [CORE_DIRECTIVES]}) 
export class MyDirective { 
    @Input() inputSettings : SettingsClass; 
    @Input() count : number; 

    onChanges(map) { 
     console.log('onChanges'); 
    } 
} 

yönergesi html kullanılır: settings.count sonra değiştirilir

... 
    <my-directive [input-settings]="settings" [count]="settings.count"></my-directive> 
    ... 

Eğer onChanges patlayacaktır. Ayarlar sınıfındaki başka bir özellik değişirse, o zaman yanmaz.

nasıl ayarlara herhangi özelliğine bir değişiklik olursa algılayabilir? HTML'nize olarak

+0

Benim tahmin bu (şu anda olduğu:

özel çek yöntemini uygulamak için, öncelikle daha sonra ngDoCheck() aşağıdaki gibi kod şey yazabilirsiniz SettingsClass öyle ki sınıfın bir .equals() yöntemi uygulamak gerekir?) inputSettings' bir nesnenin örneğine başvuru içeriyor ve referans kendisi değişmez çünkü görmek ya da bir rapor etmez, böylece Eğik muhtemelen nesne özelliklerini karşılaştırmak için çalışmaz belki 'çünkü ... çalışmıyor değişiklik. (Yanılıyorsam, yoksa onlar bunu düzeltmek umut umuyoruz.) –

+0

Nitekim [Victor ŞAVKIN blog post] (http://victorsavkin.com/post/133936129316/angular-immutability-and-encapsulation) benim varsayımları teyit: "Adres nesnesi değiştirilemiyorsa, başka bir bileşen, yeni bir adres nesnesi oluşturmadan sokak özelliğini güncelleştirebilir. Bu olursa, onChanges kancası çağrılmaz". –

+0

siz de size kod örneğini açıklayınız özelliği aracılığıyla giriş özelliği – Ayyash

cevap

46
nesne farklı bir nesneye değiştirilmiş ise, Eğik sadece göreceksiniz

(yani nesne referans olarak değiştirin, CamelCase kullanamazsınız değişti), ngOnChanges(), sorununuzu çözmek için kullanılamaz. Daha fazla bilgi için bkz. Victor Savkin's blog post.

Sen MyDirective sınıfta ngDoCheck() yöntemini uygulamak. Bu yaşam döngüsü kancası "bir bileşenin veya yönergelerin giriş özelliklerinin her kontrol edildiği her zaman denir. Özel bir denetim gerçekleştirerek değişiklik algılamayı genişletmek için bunu kullanın."

ngDoCheck() { 
    if(!this.inputSettings.equals(this.previousInputSettings)) { 
     // inputSettings changed 
     // some logic here to react to the change 
     this.previousInputSettings = this.inputSettings; 
    } 
} 
-4

Eğer

<my-directive [input-settings]="settings" [count]="settings.count"></my-directive>

+0

İyi yakalama, ancak bu onChanges ateş etmiyor. Örneğin yanlış yazdım. – Peter

+5

Bu şimdi modası geçmiş. Şablonlardaki alpha.52 özellikleri büyük/küçük harfe duyarlı olduğundan. –

+0

Nitekim, HTML'nin kendisi büyük/küçük harfe duyarlı olmamasına rağmen, Angular'ın HTML'si büyük/küçük harfe duyarlıdır. Bunun için açısal eleştirilir. Bu da karışıklığa neden olur. – Gherman