AngularJS'de bir yönerge yazarken, yeni bir kapsam, yeni bir çocuk kapsamı veya yeni bir yalıtılmış kapsama ihtiyacım olup olmadığına nasıl karar verebilirim?


265

Ben yeni bir yönerge yazarken hangi kapsam türü kullanılacak belirlemek için kullanabileceğiniz bazı yönergeler arıyorum. İdeal olarak, bir dizi sorudan geçen ve yeni bir kapsam, yeni çocuk kapsamı veya yeni tecrit kapsamı olmayan doğru bir cevap veren bir akış şemasına benzer bir şey istiyorum, ancak bu muhtemelen çok fazla şey istiyor. Şu andaki önemsiz kılavuzlarım:

Bir öğe üzerinde izole kapsamı olan bir yönerge kullanmanın, aynı eleman üzerindeki diğer tüm yönergeleri aynı (bir) izolat kapsamını kullanmaya zorladığını biliyorum, bu yüzden bir izolat kapsamı kullanıldığında bu ciddi bir şekilde sınırlanmıyor mu?

Angular-UI ekibinden (veya birçok direktif yazmış olanlardan) bazılarının deneyimlerini paylaşabileceğini umuyorum.

Lütfen "yeniden kullanılabilir bileşenler için yalıtılmış bir kapsam kullanın" yazan bir yanıt eklemeyin.


"alt kapsam" ile bağlantı işlevinde "kapsam. $ new ()" ile kapsam oluşturmak mı istiyorsunuz? Çünkü bildiğim gibi, direktif yalıtılmış bir kapsama sahip olabilir ya da olmayabilir (böylece kullanılan kapsamı kullanacaksınız)
Valentyn Shybanov

3
@ValentynShybanov Ayarı scope: true, $scope.new()otomatik olarak kullanılarak bir alt kapsam oluşturur .
Josh David Miller

2
@Valentyn, Josh'un söylediği şey: yani, üç olasılık scope: false(varsayılan, yeni kapsam yok), scope: true(prototip olarak miras alan yeni kapsam) ve scope: { ... }(yeni tecrit kapsamı).
Mark Rajcok

1
Evet, teşekkürler. "Doğru" ve "{}" arasındaki farkı kaçırdım. Bunu bildiğim iyi oldu.
Valentyn Shybanov

Genelde görmezden gelme eğiliminde olan bir 4. dava var .. bu "direktif kontrolörü" .. Bence soru da onları da içerecek şekilde genişletilmelidir ... +1 soruya .. ..
ganaraj

Yanıtlar:


291

Ne güzel bir soru! Ben istiyorum aşk diğerleri ne söyleyeceklerini duymak, ama burada kullandığım kurallar vardır.

Yüksek irtifa önceliği: kapsam, ana denetleyici, yönerge ve yönerge şablonu arasında iletişim kurmak için kullandığımız "tutkal" olarak kullanılır.

Ebeveyn Kapsamı: scope: false hiçbir yeni kapsam yok

Bunu çok sık kullanmıyorum, ama @MarkRajcok'un dediği gibi, direktif herhangi bir kapsam değişkenine erişmiyorsa (ve açıkçası herhangi bir şey ayarlamıyorsa!) O zaman bu benim endişelendiğim kadarıyla gayet iyi. Bu, yalnızca üst yönerge bağlamında kullanılan (her zaman istisnalar olsa da) ve şablonu olmayan alt yönergeler için de yararlıdır . Temelde bir şablonu olan herhangi bir şey bir kapsamı paylaşmaya ait değildir, çünkü bu kapsamı erişim ve manipülasyon için doğası gereği ortaya çıkarırsınız (ancak bu kuralın istisnaları olduğundan eminim).

Bir örnek olarak, son zamanlarda yazma sürecinde olduğum bir SVG kütüphanesi kullanarak (statik) vektör grafiği çizen bir direktif oluşturdum. Bu $observeiki özellik (s widthve heightbunun ne setleri) ve kullanımlarını hesaplamalarında olanlar, ancak ne de herhangi bir kapsam değişkenleri okur ve hiçbir şablon vardır. Bu, başka bir kapsam oluşturmamak için iyi bir kullanım durumudur; birine ihtiyacımız yok, neden rahatsız oluyorsun?

Ancak başka bir SVG direktifinde, kullanmak için bir dizi veriye ihtiyacım vardı ve ek olarak küçük bir durum depolamak zorunda kaldım. Bu durumda, ana kapsamı kullanmak sorumsuz olacaktır (yine genel olarak konuşursak). Bunun yerine...

Çocuk Kapsamı: scope: true

Alt kapsamı olan yönergeler bağlama duyarlıdır ve mevcut kapsamla etkileşime girmesi amaçlanmıştır.

Açıkçası, bunun ayrı bir kapsam üzerinden önemli bir avantajı, kullanıcının istediği özelliklerde enterpolasyonu kullanmakta serbest olmasıdır; örneğin class="item-type-{{item.type}}", ayrı bir kapsamı olan bir yönergede kullanmak varsayılan olarak çalışmaz, ancak alt kapsamı olan bir yönerge üzerinde iyi çalışır çünkü enterpolasyon yapılan her ne varsa varsayılan olarak üst kapsamda bulunabilir. Ayrıca, direktifin kendisi, ebeveynlerde kirlilik veya hasar konusunda endişe duymadan nitelikleri ve ifadeleri kendi kapsamı içinde güvenli bir şekilde değerlendirebilir.

Örneğin, bir araç ipucu yeni eklenen bir şeydir; ayrı bir kapsam çalışmaz (varsayılan olarak aşağıya bakın) çünkü burada başka yönergeler veya enterpolasyonlu özellikler kullanmamız beklenir. Araç ipucu sadece bir geliştirmedir. Ancak araç ipucu, bir alt yönerge ve / veya şablonla kullanmak ve açıkça kendi durumunu yönetmek için kapsamda bazı şeyler ayarlaması gerekir, bu nedenle ana kapsamı kullanmak oldukça kötü olurdu. Onu kirletiyoruz ya da ona zarar veriyoruz ve ikisi de bueno değil.

Kendimi çocuk kapsamlarını izolat veya ebeveyn kapsamlarından daha sık kullandığımı görüyorum.

İzolasyon kapsamı: scope: {}

Bu yeniden kullanılabilir bileşenler içindir. :-)

Ama cidden, "yeniden kullanılabilir bileşenler" i "bağımsız bileşenler" olarak düşünüyorum. Amaç, belirli bir amaç için kullanılmasıdır, bu nedenle bunları diğer direktiflerle birleştirmek veya DOM düğümüne diğer enterpolasyonlu öznitelikleri doğal olarak eklemek mantıklı değildir.

Daha açık olmak gerekirse, bu bağımsız işlevsellik için gereken her şey, ana kapsam bağlamında değerlendirilen belirtilen özniteliklerle sağlanır; bunlar tek yönlü dizeler ('@'), tek yönlü ifadeler ('&') veya iki yönlü değişken bağlamalardır ('=').

Bağımsız bileşenler üzerinde, kendi başına var olduğu için diğer direktifleri veya öznitelikleri uygulamanız mantıklı değildir. Stili kendi şablonu tarafından yönetilir (gerekirse) ve uygun içeriğin (gerekirse) aktarılmasını sağlayabilir. Tek başına, bu yüzden ayrı bir kapsamda diyoruz ki: "Bununla karıştırmayın. Bu birkaç özellik aracılığıyla size tanımlanmış bir API veriyorum."

İyi bir en iyi uygulama, yönlendirme bağlantısı ve denetleyici işlevlerinden mümkün olduğunca şablon tabanlı öğeleri hariç tutmaktır. Bu, başka bir "API benzeri" yapılandırma noktası sağlar: direktifin kullanıcısı şablonu basitçe değiştirebilir! Tüm işlevsellik aynı kaldı ve dahili API'sine asla dokunulmadı, ancak stil ve DOM uygulamasıyla ihtiyacımız olduğu kadar karışabiliriz. ui / bootstrap bunu nasıl yapabileceğinize harika bir örnektir, çünkü Peter & Pawel harika.

İzolat kapsamları da transklüzyon ile kullanım için mükemmeldir. Sekmeleri al; sadece tüm işlevsellik değildir, aynı zamanda içindeki her ne olursa olsun, sekmeleri (ve bölmeleri) istediklerini yapmak için terk ederken ebeveyn kapsamından serbestçe değerlendirilebilir. Sekmeler açıkça kendi sahip devlet (şablonla etkileştiği için) kapsamına aittir, ama bu durum kullanıldıktan hangi bağlamda ile ilgisi yoktur - bu sekme sekme direktifi kılan tamamen iç bulunuyor. Ayrıca, sekmelerle başka yönergeler kullanmak pek mantıklı değildir. Bunlar sekmeler - ve zaten bu işlevselliğe sahibiz!

Daha fazla işlevsellik ile çevreleyin veya daha fazla işlevsellik ekleyin, ancak yönerge zaten budur.

Bütün bunlar, @ProLoser'ın cevabında ima ettiği gibi, bir izolat kapsamının bazı sınırlamaları (yani özellikler) etrafında yolların olduğunu not etmeliyim. Örneğin, alt kapsam bölümünde, bir yalıtımlı kapsam kullanılırken (varsayılan olarak) kesilen yönerge dışı nitelikler üzerinde enterpolasyondan bahsetmiştim. Ancak kullanıcı, örneğin, sadece kullanabilir class="item-type-{{$parent.item.type}}"ve bir kez daha işe yarayacaktır. Dolayısıyla, bir çocuk kapsamı üzerinde ayrı bir kapsam kullanmak için zorlayıcı bir neden varsa, ancak bu sınırlamalardan bazıları için endişeleniyorsanız, ihtiyacınız varsa neredeyse hepsinin etrafında çalışabileceğinizi bilin.

özet

Yeni kapsamı olmayan yönergeler salt okunurdur; tamamen güvenilirdirler (yani uygulamanın içinde) ve krikoya dokunmazlar. Alt kapsamı olan yönergeler işlevsellik ekler , ancak bunlar tek işlev değildir . Son olarak, tecrit kapsamları tüm hedef olan yönergeler içindir; onlar bağımsız, bu yüzden haydut gitmelerine izin (ve çoğu "doğru") tamam.

İlk düşüncelerimi çıkarmak istedim, ama daha fazla şey düşündüğümde, bunu güncelleyeceğim. Ama kutsal saçmalık - bu bir SO cevabı için uzun ...


PS: Tamamen teğet, ama biz kapsamlar hakkında konuştuğumuz için, ben "prototip" demeyi tercih ederken, diğerleri "daha doğru gibi görünüyor ama sadece dilini iyi yuvarlanan" prototip "tercih ederim. :-)


Teşekkürler Josh, harika cevap. Bunun için uzun cevaplar istedim / bekledim. Takip etmediğim iki şey: 1) çocuk kapsamı: "kullanıcı istediği özelliklerde enterpolasyonu kullanmakta serbesttir". 2) kapsamı izole edin: "ya da hepsi değil, '?' Durumunda" Bunları biraz ayrıntılandırabilir misiniz? (Daha
kolaysa

@MarkRajcok (1) için, onu daha az belirsiz hale getirmek için değiştirdim - başarısız olup olmadığımı bana bildirin. (2) için, bu bir yazım hatası ve zayıf ifadelerin bir kombinasyonuydu; Bu paragrafı daha net olarak yeniden yazdım. Ayrıca bir iki örnek daha ekledim, birkaç şeyi daha netleştirdim ve bazı yazım hatalarını düzelttim.
Josh David Miller

Cevapta belirtildiği gibi - açısal için bootstrap bunları birleştirmenin harika bir örneğidir. Akordeon örneğini özellikle yararlı buldum - GitHub - Akordeon
CalM

Çocuk kapsamlarını en çok kullandığınızdan bahsettiniz, direktiflerin tekrar kullanılabilir şeklinin en yaygın olduğunu düşündüm ve sadece bir kez kullanılması gereken direktifleri yazmaktan kaçındım. Buna gerek yok mu? Bazen HTML'im çok büyük olduğunda, bu bölümü bir yönerge içine taşımak gibi hissediyorum ama sadece bir kez kullanılacağı için sadece html'de bırakıyorum.
user2483724 20:14

2
@ user2483724 Çok yaygın bir yanlış anlama, "yeniden kullanılabilir" direktiflerin ayrı bir kapsam kullanan kişiler olduğudur; öyle değil. Önceden paketlenmiş direktiflere bakarsanız, neredeyse hiçbiri izolat kapsamları kullanmaz - bazıları çocuk kapsamı bile değildir - ancak tekrar kullanılabilir olduklarından eminim! Kural, direktifin kapsamının nasıl kullanıldığı konusunda olmalıdır. Sadece bir dosyada yer kazanmakla ilgili ise, bir direktifin en iyi yaklaşım olduğundan emin değilim. Geliştiricinin uğruna işlem süresini uzatır. Ama eğer gerekiyorsa, o zaman devam et. Veya bir ngInclude. Ya da yapınızın bir parçası olarak yapın. Birçok seçenek!
Josh David Miller

52

Kişisel politikam ve deneyimim:

İzole: özel bir sanal alan

SADECE direktifim tarafından kullanılan ve hiçbir zaman kullanıcı tarafından görülmeyen veya doğrudan erişilmeyen bir çok kapsam yöntemi ve değişkeni oluşturmak istiyorum. Hangi kapsam verilerini kullanabileceğimi beyaz listeye eklemek istiyorum. Kullanıcının üst kapsamda (etkilenmemiş) geri atlamasına izin vermek için ekleme işlemini kullanabilirim . Ben do DEĞİL benim değişkenler ve çapraz dahil çocuklarda erişilebilir metotları istiyorum.

Çocuk: bir içerik alt bölümü

Ben kapsam yöntem ve değişkenleri oluşturmak istediğiniz CAN kullanıcı tarafından erişilebilir, ancak benim görevimde bağlamı dışında kapsamları (kardeşleri ve ebeveynleri) çevreleyen ile ilgili değildir. Ayrıca TÜM ebeveyn kapsam verilerinin şeffaf bir şekilde damlamasına izin vermek istiyorum.

Hiçbiri: basit, salt okunur yönergeler

Kapsam yöntemleri veya değişkenlerle uğraşmak zorunda değilim. Muhtemelen kapsamları ile ilgili bir şey yapmıyorum (basit jQuery eklentileri, doğrulama, vb görüntüleme gibi).

notlar

  • NgModel'in veya başka şeylerin kararınızı doğrudan etkilemesine izin vermemelisiniz. ng-model=$parent.myVal(Child) veya ngModel: '='(isolate) gibi şeyler yaparak garip davranışlardan kaçınabilirsiniz .
  • Isolate + transclude , tüm normal davranışları kardeş yönergelerine geri yükler ve üst kapsama geri döner, bu nedenle bunun da yargınızı etkilemesine izin vermeyin.
  • Üzerinde kapsamı ile dalga geçme hiçbiri bu alt DOM yarısına ancak 0 mantıklı üst yarısı için kapsam verileri koymak gibidir çünkü.
  • Direktif önceliklerine dikkat edin (bunun bir şeyi nasıl etkileyebileceğine dair somut örneklere sahip olmayın)
  • Herhangi bir kapsam türüyle yönergeler arasında iletişim kurmak için hizmetleri enjekte edin veya denetleyicileri kullanın. require: '^ngModel'Üst öğelere bakmak için de yapabilirsiniz .

1
Bu kısmı yanlış anlamış olabilirim: "Isolate + transclude, tüm normal davranışları kardeş direktiflere geri yükleyecektir". Bu dalma makinesine bakın . Konsola bakmanız gerekecek.
Josh David Miller

1
Analizleriniz / cevabınız için teşekkürler ProLoser. Angularjs-ui etiketini ekleseydim bu gönderiyi görmeyi umduğum insanlardan birisin.
Mark Rajcok

@JoshDavidMiller aynı DOM öğesindeki yönergelerden bahsederken işler daha karmaşık hale gelir ve bunun yerine öncelik özelliğine bir göz atmaya başlamalısınız. Transkripsiyon, çocuk içeriği ile daha ilgilidir.
ProLoser

1
@ProLoser Doğru, ama bu ifade ile ne demek istediğinden emin değilim. Açıkça çocukları etkiliyorlar, ancak direktiflerin kapsamları kardeş direktiflerini nasıl etkiler?
Josh David Miller

18

Çok fazla direktif yazdıktan sonra daha az isolatedkapsam kullanmaya karar verdim . Her ne kadar havalı olsa ve verileri kapsasanız ve verileri ana kapsama sızdırmadığınızdan emin olsanız da, birlikte kullanabileceğiniz yönerge miktarını ciddi şekilde sınırlar. Yani,

Yazacağınız direktif tamamen kendi başına davranacaksa ve diğer direktiflerle paylaşmayacaksanız, izole kapsam için gidin . (bir bileşen gibi, sadece son geliştirici için çok fazla özelleştirme ile takabilirsiniz) (içinde yönergeleri olan alt öğeler yazmaya çalıştığınızda çok daha zorlaşır)

Yazacağınız yönerge, yalnızca içsel kapsam durumu veya açık kapsam değişiklikleri gerektirmeyen dom manipülasyonları yapacaksa (çoğunlukla çok basit şeyler); gitmek hiçbir yeni kapsam . (örneğin ngShow, ngMouseHover, ngClick, ngRepeat)

Yazacağınız yönergenin üst kapsamdaki bazı öğeleri değiştirmesi gerekiyorsa, ancak bazı iç durumları da ele alması gerekiyorsa, yeni alt kapsamı seçin . (gibi ngController)

Yönergeler için kaynak kodunu kontrol ettiğinizden emin olun: https://github.com/angular/angular.js/tree/master/src/ng/directive
Bunları nasıl düşüneceğinize çok yardımcı olur


Birkaç bileşenin birbiriyle iletişim kurması gerekiyorsa, kapsamı ve kullanımı yalıtılmış olabilir require, bu nedenle yönergelerinizi hala ayırmayın. Peki olasılıkları nasıl sınırlar? Yönergeleri daha da spesifik hale getirir (bu nedenle neye bağlı olduğunuzu beyan edin). Bu yüzden sadece bir kural bırakırım: direktifinizin durumu varsa veya kullanıldığı alandan bazı verilere ihtiyaç duyuyorsa - yalıtılmış kapsamı kullanın. Aksi takdirde kapsam kullanmayın. Ve "çocuk kapsamları" hakkında - Ben de çok fazla direktif yazdım ve bu özelliğe hiç ihtiyaç duymadım. "Üst kapsamdaki bazı öğeleri değiştirmeniz gerekiyorsa" - bağlama kullanın.
Valentyn Shybanov

Ayrıca, "ana kapsamdaki bazı öğeleri değiştirmeniz gerekiyor" - alt kapsamdaki bir şeyi değiştirirseniz, ana kapsamda değişiklikler yapılmazsa (kirli $parentkesmek kullanmadıkça ). Bu yüzden aslında direktifler için "çocuk kapsamları" oldukça arkada kullanılması gereken bir şeydir - ngRepeatbu, her öğenin tekrarlanması için yeni çocuk kapsamları yaratır (ancak bunu kullanarak scope.$new();ve kullanmaz scope: true.
Valentyn Shybanov

1
Aynı öğede birden çok yalıtılmış kapsam isteyemezsiniz, bunları açıkça bağlamadığınız sürece üst kapsamdaki işlevlere erişemezsiniz. (İyi şanslar kullanarak ngClickvb.) Gerekli bir tür ayrıştırma yaratır, katılıyorum, ancak yine de üst direktifin farkında olmanız gerekiyor. Bir bileşen gibi olmadığı sürece , tecrit etmeye karşıyım. Direktifler (en azından çoğu) yüksek oranda yeniden kullanılabilir durumdadır ve izolasyon bunu kırmaktadır.
Umur Kontacı

Alt kapsamları direktiflerde de kullanmıyorum, ancak alt kapsam prototip olarak üst kapsamdan miras aldığından, üst kapsamdaki bir özellik içindeki bir özelliğe erişim varsa, değişiklikler doldurulur. Angular'ın yazarları MTV buluşmasında bunun hakkında konuştu, "bir yerde bir
noktaya

5
İlk olarak, bence izolat kapsamlarında biraz fazla sertsiniz. Sanırım sahip olduğunuz için kredi verdiğinizden daha geniş uygulanabilirliğe sahipler ve bunları kullanırken karşılaştığımız (doğru) belirttiğiniz zorlukların birçoğundan kaçınmanın yolları var. Ben de "son geliştirici için fazla özelleştirme" ile aynı fikirde değilim - ayrıntılar için cevabım bakın. Bununla birlikte, cevabınız ne kötü ne de yanlıştı ve soruyu ele aldı, bu yüzden neden aşağı oy aldığından emin değilim. Yani +1.
Josh David Miller

9

Şu anki anlayışımı ve diğer JS kavramlarıyla ilişkisini nasıl ekleyeceğimi düşündüm.

Varsayılan (ör. Beyan edilmemiş veya kapsam: yanlış)

Bu, felsefi olarak küresel değişkenlerin kullanımına eşdeğerdir. Direktifiniz ana denetleyicideki her şeye erişebilir, ancak aynı zamanda onları etkiler ve aynı anda etkilenir.

dürbün:{}

Bu bir modül gibidir, kullanmak istediği her şeyin açıkça aktarılması gerekir. Eğer kullandığınız HER yönerge ayrı bir kapsam ise, tüm bağımlılıkları enjekte ederek ek yükü ile kendi modülünü yazdığınız HER JS dosyasını yapmaya eşdeğer olabilir.

kapsam: çocuk

Küresel değişkenler ile açık geçişler arasındaki orta zemin budur. Javascript'in prototip zincirine benzer ve sadece üst kapsamın bir kopyasını genişletir. Bir ayrı tutma kapsamı oluşturup üst kapsamın her özniteliğini ve işlevini iletirseniz, işlevsel olarak buna eşdeğerdir.


Anahtar, HERHANGİ BİR direktif HERHANGİ bir şekilde yazılabilir olmasıdır. Farklı kapsam bildirimleri düzenlemenize yardımcı olmak için hazırdır. Her şeyi bir modül yapabilir veya tüm global değişkenleri kullanabilir ve çok dikkatli olabilirsiniz. Bakım kolaylığı için, mantığınızı mantıksal olarak tutarlı parçalara dönüştürmek tercih edilir.Açık bir çayır ve kapalı bir hapishane arasında bir denge vardır. Bunun zor olmasının nedeni, insanlar bunu öğrendiğinde, direktiflerin nasıl çalıştığını öğrendiklerini düşünüyorlar, ancak aslında kod / mantık organizasyonunu öğreniyorlar.

Direktiflerin nasıl çalıştığını anlamama yardımcı olan başka bir şey de ngInclude hakkında bilgi edinmek. ngInclude, html kısmi eklemenize yardımcı olur. İlk yönergeleri kullanmaya başladığımda, kodunuzu azaltmak için şablon seçeneğini kullanabileceğinizi fark ettim ama gerçekten herhangi bir mantık eklemedim.

Tabii ki açısal direktifler ve açısal-ui ekibinin çalışmaları arasında henüz önemli bir şey yapan kendi direktifimi yaratmak zorunda kalmadım, bu yüzden bu konudaki görüşüm tamamen yanlış olabilir.


2

Umur ile hemfikirim. Teorik olarak, yalıtılmış kapsamlar harika ve "taşınabilir" gibi görünüyor, ancak uygulamamı önemsiz olmayan işlevsellik içerecek şekilde oluştururken, alana özgü bir dilin amacı olan kendi HTML kodudur.

Sonunda, bir direktifin her DOM çağrısında (ayrı kapsam ile gerektiği gibi) her küresel veya paylaşılan değeri zincirden geçirmek zorunda kalmak çok garip. Tüm bunları DOM'da tekrar tekrar yazmak aptalca görünüyor ve bunlar paylaşılan nesneler olsa bile verimsiz geliyor. Ayrıca, direktif bildirimlerini gereksiz yere karmaşıklaştırmaktadır. Yönerge HTML'sinden "ulaşmak" ve değerleri almak için $ parent kullanmanın çözümü Çok Kötü Form gibi görünüyor.

Ben de, çok az izolatla çoğunlukla çocuk kapsamı direktiflerine sahip olmak için uygulamamı değiştirdim - sadece basit, tekrarlayan olmayan özelliklerden geçebilecekleri dışında ebeveynlerden herhangi bir şeye erişmesi gerekmeyenler.

Böyle bir şey olmadan onlarca yıl boyunca Etki Alanına Özel Diller hayalini kurduktan sonra, AngularJS'in bu seçeneği sunduğundan memnunum ve bu alanda daha fazla geliştirici çalıştıkça, çok güzel uygulamalar göreceğimizi biliyorum. mimarları için yazması, genişletmesi ve hata ayıklaması da kolaydır.

- D

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.