Soru Angular2 - özel değişkenler şablonda erişilebilir olmalı mı?


Bir değişken beyan edilirse private Bir bileşen sınıfında, bu bileşenin şablonuna erişebilmeli miyim?

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>{{title}}</h2>
      <h2>Hello {{userName}}</h2> // I am getting this name
    </div>
  `,
})
export class App {
  public title = 'Angular 2';
  private userName = "Test Name"; //declared as private
}

90
2018-01-03 07:03


Menşei


@Yaroslav Admin'in cevabı doğru. Lütfen cevabınız için seçiminizi değiştirin. - maxisam


Cevaplar:


Düzenleme: Bu cevap artık yanlış. Yayınladığımda konuyla ilgili resmi bir yönlendirme yoktu, ancak Yaroslov'un (mükemmel ve doğru) cevabında açıklandığı gibi, bu artık geçerli değil: Codelizer şimdi uyarıyor ve bileşen şablonlarındaki özel değişkenlere yapılan referanslarda AoT derlemesi başarısız oluyor. . Bu, kavramsal bir düzeyde, burada her şeyin geçerli olduğunu söyledi, bu yüzden bu cevabı faydalı göründüğü gibi bırakacağım.


Evet, bu bekleniyor.

Unutmayın ki private ve diğer erişim düzenleyicileri, Türler yapılarıdır; Bileşen / denetleyici / şablon ise, Türnün hiçbir şey bilmediği açısal yapılardır. Erişim değiştiricileri kontrol görünürlüğü arasında sınıflar: Bir alan yaratmak private önler diğer sınıflar ona erişmekten, ancak şablonlar ve denetleyiciler var olan şeylerdir içinde sınıflar.

Bu teknik olarak doğru değil, (sınıfların dekoratörlerle ve meta verilerle nasıl ilişkili olduğunu anlamak yerine), bu şekilde düşünmek yararlı olabilir, çünkü önemli olan şey (IMHO) şablon ve denetleyici hakkındaki düşünceden ayrı olarak değişmektir. Bileşenleri Bileşen yapısının birleşik parçaları olarak düşünmeye - bu, ng2 zihinsel modelin önemli yönlerinden biridir.

Bu şekilde düşünmek, belli ki bekliyoruz private Şablon sınıfında yer alan değişkenler şablonunda görünecek şekilde aynı sebepten dolayı görünür olmasını bekliyoruz private Bu sınıftaki yöntemler.


65
2018-01-03 08:37



İlk olarak, tıpkı senin gibi çalıştım. Ama tslint'i 4.02'ye ve codelyzer'i 2.0.0-beta.1'e yükselttim ve görünümlerdeki değişkenlere erişirken özel kullanamayacağımı söyleyen hatalar yaşadım. Yani Yaroslav'un ​​cevabı daha uygun görünüyor. - maxime1992
Cevabınızı reddetmekten nefret ediyorum, bu yüzden yapmayacağım. Ama umarım ki, Yuri'nin çuval öğrenmesi konusundaki cevabını inceleyebilirsiniz. - maxisam
@maxisam ah, bunu dikkatime sunduğun için teşekkürler - uzunca bir süre bakmamıştım. Not eklendi. - drewmoore
Bir bileşen modelinin kendi özel değişkenlerini görememesinin mantıklı olmadığını kabul ediyorum, muhtemelen derleme sırasında aynı sınıfa ezilmeli, yani, bileşene özel özellikler, nesneler ve işlevler göstermelisiniz. tüm diğer bileşenler, şablonunuzdakileri kullanabilmeniz için, harici ince ayarlardan veya bunların çağrılmasından bahsetmediğinizde, bitmiş bileşende beklenmedik davranışlara neden olabilir - Felype
@drewmoore, merhaba Sadece birkaç ay için köşeli kodlama yapıyorum. Bu konuyla karşı karşıya kaldım. Bu konuda başka tartışma var mı? Takip edeceğim modele özel bir şey bulamadığım için. imo, olduğu gibi, kod ayırma ihlali gibi görünüyor. - Edgar


Hayır, şablonlarınızda özel değişkenler kullanmamalısınız.

Ben beğendim drewmoore'un cevabı ve bunun içinde kusursuz kavramsal mantığı görüyoruz, uygulamada yanlış. Şablonlar, bileşen sınıfları içinde değil, bunların dışında bulunur. Şuna baksana bu repo kanıt için.

Çalışmanın tek nedeni, TypeScript’in private anahtar kelime gerçekten üye özel yapmaz. Tam zamanında derleme, çalışma zamanında bir tarayıcıda gerçekleşir ve JS'nin herhangi bir özel üye kavramı yoktur (henüz?). Kredi gider Sander Elias Beni doğru yola koyduğun için.

İle ngc ve Önde Gelen derleme, şablonun özel üyelerine erişmeye çalışırsanız hata alırsınız. Klon gösteri repo, değişim MyComponent Üyelerin özel görünürlükleri ve çalışırken derleme hataları alırsınız ngc. Burada da Cevap Ahead-of-Time derleme için spesifik.


138
2017-08-17 14:55



Bu en iyi yorum ve kabul edilen cevap olmalıdır imo. Özel değişkenleri nakledildikten sonra kullanamazsınız, yapmanız gerekir .. Kodu temiz tutun! - Sam Vloeberghs
Bu tek geçerli cevap! Codelyzer şimdi şablonunuzda özel var kullandığınızda sizi uyarır. - maxime1992
Bunu kod tabanımızda gördük ve çifte yaptık. Aklımı kaybetmediğimi onayladığın için teşekkürler :) - Graham Fowles
Bununla ilgili tek sorunum, dış dünyaya değil yalnızca şablonumuza sunmak istediğimiz üyelere @Inputs ve Outputs gibi kamuya açık olarak ortaya çıkan üyeler arasındaki farkı nasıl ayırt edersiniz? Şablon için erişilebilir olan ancak diğer bileşenlere erişilemeyen yöntemleri / üyeleri istediğiniz yeniden kullanılabilir bileşenler oluşturuyorsanız. Orijinal cevabın doğru olduğunu düşünüyorum. Şablonlar, bileşenin parçasıdır. - Ashg


Kod örneği soruyu TipScript ile ilgili olsa bile,  etiket. Dart için Angular2 de mevcuttur ve bu Dart için dikkate değer bir farktır.

İçinde Dart oyunu  şablon özel değişkenlere referans olamazBileşen sınıfının, çünkü TypeScript'in aksine Dart, özel üyelerin dışarıdan erişimini etkin bir şekilde engeller.

Ben hala bileşen hakkında düşünmek için @drewmoores öneri ve yine de bir birim olarak şablon.

Güncelleme (TS) Angular2 TS de özel mülklere çevrimdışı derleme erişimi daha sınırlı olacak gibi görünüyor https://github.com/angular/angular/issues/11422


13
2018-04-13 09:17



Çok ilginç bir nokta, bunu işaret ettiğine sevindim - bunun bir karışıklık yaratabileceğini hayal ediyorum. - drewmoore
Görünüm için erişilebilir özel değişkenleri sınırlamak için Typescript derleyicisi olması mümkün mü? - Matthew Harwood
Bilmiyorum. Sanırım hayır. - Günter Zöchbauer
@MatthewHarwood No - drewmoore
Onları gizli tutmanın, bileşenin ne kadar kararlı olduğunu nasıl etkileyebileceğini düşünürdüm? Örneğin, bir test bağlamında bir bileşen oluşturursam, şablon / sınıf etkileşiminin çalıştığını onaylamak için testten bu özel yöntemleri arayamazdım. Bunu henüz denemedim, bu yüzden eğer bu açıksa beni affet :) - Sam Storie


Özel değişkenler, bileşen şablonunda kullanılabilir. Kılavuz için angular2 hile sayfasına bakın: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter

Künye sınıfların kamu / özel üyeleri hakkında daha ayrıntılı bir açıklama burada bulunabilir: https://www.typescriptlang.org/docs/handbook/classes.html.

Tüm üyeler varsayılan olarak Genel'dir. Genel üyelere sınıf örneği ile birlikte bileşen sınıfının dışından erişilebilir. Ancak Özel üyelere yalnızca sınıf üyesi işlevleri dahilinde erişilebilir.


2
2018-03-23 07:54





Bir geçici çözüm, ts dosyasındaki özel değişkenleri ve alıcıları kullanarak olabilir.

private _userName = "Test Name";
get userName() {
  return this._userName;
}

Bu iyi bir yaklaşım çünkü ts dosyası ve html bağımsız kalır. _UserName değişken adını ts dosyasında değiştirseniz bile, şablon dosyasında herhangi bir değişiklik yapmanız gerekmez.


0
2018-03-23 19:14



_userName değerini _clientName olarak değiştirirseniz, örneğin, tutarlılık için, clientName almak için getter değiştirmeniz gerekir ... böylece bir kazanç yoktur - LeagueOfJava