Angular bileşeninde "özel" ve "genel"


120

Ben eklemezseniz özel önce foo, loadBarve text, onlar iman kamu varsayılan olarak.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

publicBileşenin içindeyken herhangi bir kullanım durumu var mı ?

Kapsülleme / güvenlik nedeniyle, privatehepsine aşağıdaki gibi eklemeli miyim ?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

Teşekkürler


Basit olmak gerekirse, bir Özel işlev yalnızca bileşende kullanılabilir. Başka bir bileşenden özel bir işleve erişmek mümkün değildir. Hizmette varsayalım, bir işlev Özel olarak bildirilirse, başka herhangi bir bileşenden erişilemez.
Kevin

Yanıtlar:


202

Bu soruya yanıt olarak söylenecek çok şey var, bunlar aklıma gelen ilk düşünceler:

Öncelikle ve en önemlisi, privatebunun yalnızca bir derleme zamanı yapısı olduğunu unutmayın - çalışma zamanında zorlanamaz ( ilgili tartışma için buraya ve buraya bakın ). Bu nedenle, lütfen privategüvenlik amacıyla herhangi bir şekilde yararlı olma düşüncelerinden kurtulun . Konu bu değil.

Bu ise kapsülleme hakkında ve size bileşeni üzerinde bir alanı veya yöntemi varken bunu başka bir yerde erişilebilir gerektiğini temizlemek yapma, içindeki kapsül istediğiniz, o zaman kesinlikle yapmalıdır private: Bu nedir privateiçindir: Niyetinize , üzerine koyduğunuz her şeye sınıf dışından dokunulmaması gerektiğini gösterir.

Aynısı için de geçerlidir public: Bu da yalnızca derleme zamanı olan bir yapıdır, bu nedenle sınıf üyelerinin publicvarsayılan olarak doğru olmasına rağmen çalışma zamanında tam olarak sıfır anlamı vardır. Ancak, sınıfınızın API'sinin bir parçası olarak dış dünyaya açık bir şekilde göstermeyi düşündüğünüz bir üyeniz olduğunda, kesinlikle publicbu amacı işaret etmelisiniz : Bunun publiciçin.

Bu, genel olarak Typescript için geçerlidir. Angular'da özellikle, bileşen sınıflarında genel üyelere sahip olmak için kesinlikle geçerli kullanım durumları vardır: Örneğin, kap / bileşen (aka akıllı / aptal ) modelini uygularken, "aptal" çocuklar yapıcı enjeksiyon yoluyla "akıllı" ebeveynleri enjekte ederken, Ebeveynin üyelerine çocuklar tarafından dokunulmaması ve dokunmaması gerektiği konusunda niyetinizi iletmeniz son derece önemlidir: Aksi takdirde, o aptal çocukları ebeveynlerinin likör dolabında dolaşırken yakaladığınızda şaşırmayın.

Öyleyse, sorunuza cevabım:

her zaman aşağıdaki gibi hepsi için özel eklemeli miyim?

bir empatik olduğunu hiçbir . Her zaman eklememelisiniz privateçünkü bunu yaparken anahtar kelimenin amacını yitirmiş olursunuz, çünkü artık her yere koyarsanız herhangi bir niyet sinyali vermez: Onu herhangi bir yere koymayabilirsiniz.


5
Açıklama için teşekkürler. Ama belki yanlış anlıyorum: Çoğu zaman özelliklerinin ve yöntemlerinin özel olması gerektiğini anlıyorum (= "yalnızca bu bileşen için"). Dolayısıyla cevap, "adamın özelliği / yöntemi dışarıya göstermesine gerek olmadığı sürece varsayılan olarak EVET" olmalıdır. Hayır ? Neden açıklamanızı "hayır" ("asla" gibi geliyor) diye yanıtlayarak sonuçlandırasınız?
M'sieur Toph

1
Açısal 2 öğreticiyi kırdım ve ne zaman halkı kullanmam gerektiğini anlamadım. Bileşen iletişimi için birçok değişken vardır: angular.io/docs/ts/latest/cookbook/… Muhtemelen, yalnızca Input Output aracılığıyla tanımlanan özellikler ve yöntemler için public kullanmalıyız. Ama emin değilim.
Ruslan Borovok

Yapıcıda sınıf içinde kullanılmayan, ancak dışarıda kullanılan (yani bir şablonun veya başka bir bileşenin içinde) bir özellik bildirdiğimde genellikle 'public' kullanmam gerekir.
tuliomarchetto

18

@drewmoore, özel / kamuoyunun amaca bağlı olduğu konusunda iyi bir cevap sağlar. Ancak, enjekte edilen özel değerleri kullanırken dikkate alınması gereken birkaç nokta daha var:

TypeScript'i AoT derleme işleminin çıktısı olarak yayınlamak istiyorsak, bileşenlerimizin şablonlarında yalnızca genel alanlara eriştiğimizden emin olmalıyız **


İlk noktanız: Bu hataların bir üyenin özel veya halka açık olmasıyla ilgisi yoktur, sadece birinin kullanılmadığını gösterirler. İkinci iki puanınız, soru şablonlarda özel üyelere başvurmakla ilgiliyse geçerli olur , ancak bu geçerli değildir. Şu soru için buraya bakın
Drew moore

@drewmoore, haklısınız ve kullanılmadıklarını gösterdiklerini anlıyorum. Ancak, genel değişkenler harici olarak kullanılabilir, böylece bu uyarıyı asla tetiklemeyecektir. "Bileşende herkese açık olduklarında herhangi bir kullanım durumu var mı?" Sorularının kendisine gelince, ikinci ve üçüncü noktalarımın en azından herkese açık olduklarında , özellikle bunları şablonda kullanmak istediğinizde bir kullanım durumunu gösterdiğine inanıyorum. (alıntılanan metinde belirtildiği gibi).
Lucas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.