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 $observe
iki özellik (s width
ve height
bunun 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. :-)