Pertanyaan yang sangat bagus! Saya akan senang mendengar apa yang dikatakan orang lain, tapi di sini adalah pedoman saya gunakan.
Premis ketinggian tinggi: ruang lingkup digunakan sebagai "lem" yang kami gunakan untuk berkomunikasi antara pengendali induk, direktif, dan template direktif.
Lingkup Induk:, scope: false
jadi tidak ada ruang lingkup sama sekali
Saya tidak terlalu sering menggunakan ini, tetapi seperti kata @MarkRajcok, jika direktif tidak mengakses variabel ruang lingkup (dan jelas tidak mengatur apa pun!) Maka ini baik-baik saja sejauh yang saya ketahui. Ini juga bermanfaat untuk arahan anak yang hanya digunakan dalam konteks arahan orang tua (meskipun selalu ada pengecualian untuk ini) dan yang tidak memiliki template. Pada dasarnya apa pun dengan templat tidak termasuk berbagi lingkup, karena Anda secara inheren mengekspos cakupan untuk akses dan manipulasi (tapi saya yakin ada pengecualian untuk aturan ini).
Sebagai contoh, saya baru-baru ini membuat arahan yang menggambar grafik vektor (statis) menggunakan perpustakaan SVG saya sedang dalam proses penulisan. Ini $observe
dua atribut ( width
dan height
) dan menggunakannya dalam perhitungannya, tetapi tidak menetapkan atau membaca variabel lingkup apa pun dan tidak memiliki templat. Ini adalah kasus penggunaan yang baik untuk tidak menciptakan cakupan lain; kita tidak membutuhkannya, jadi mengapa repot-repot?
Tetapi dalam arahan SVG yang lain, saya membutuhkan satu set data untuk digunakan dan juga harus menyimpan sedikit keadaan. Dalam hal ini, menggunakan ruang lingkup orang tua tidak bertanggung jawab (sekali lagi, secara umum). Jadi sebagai gantinya ...
Lingkup Anak: scope: true
Arahan dengan lingkup anak adalah sadar konteks dan dimaksudkan untuk berinteraksi dengan lingkup saat ini.
Jelas, keuntungan utama dari ini di atas lingkup isolasi adalah bahwa pengguna bebas menggunakan interpolasi pada atribut apa pun yang mereka inginkan; mis. menggunakan class="item-type-{{item.type}}"
direktif dengan cakupan isolat tidak akan berfungsi secara default, tetapi berfungsi baik pada direktif dengan cakupan anak karena apa pun yang diinterpolasi masih dapat ditemukan secara default dalam lingkup induk. Juga, arahan itu sendiri dapat dengan aman mengevaluasi atribut dan ekspresi dalam konteks ruang lingkupnya sendiri tanpa khawatir tentang polusi atau kerusakan pada induknya.
Sebagai contoh, tooltip adalah sesuatu yang baru saja ditambahkan; ruang lingkup isolasi tidak akan berfungsi (secara default, lihat di bawah) karena diharapkan kita akan menggunakan arahan lain atau atribut yang diinterpolasi di sini. Tip alat hanyalah tambahan. Tetapi tooltip juga perlu mengatur beberapa hal pada lingkup untuk digunakan dengan sub-direktif dan / atau template dan jelas untuk mengelola keadaannya sendiri, sehingga akan sangat buruk untuk menggunakan lingkup induk. Kami mencemari atau merusaknya, dan bueno juga tidak.
Saya menemukan diri saya menggunakan cakupan anak lebih sering daripada lingkup isolasi atau orangtua.
Ruang lingkup isolasi: scope: {}
Ini untuk komponen yang dapat digunakan kembali. :-)
Tapi serius, saya menganggap "komponen yang dapat digunakan kembali" sebagai "komponen mandiri". Maksudnya adalah bahwa mereka harus digunakan untuk tujuan tertentu, jadi menggabungkan mereka dengan arahan lain atau menambahkan atribut interpolasi lainnya ke simpul DOM secara inheren tidak masuk akal.
Untuk lebih spesifik, apa pun yang diperlukan untuk fungsi mandiri ini disediakan melalui atribut tertentu yang dievaluasi dalam konteks lingkup induk; mereka bisa berupa string satu arah ('@'), ekspresi satu arah ('&'), atau binding variabel dua arah ('=').
Pada komponen mandiri, tidak masuk akal untuk perlu menerapkan arahan atau atribut lain karena itu ada dengan sendirinya. Gayanya diatur oleh template sendiri (jika perlu) dan dapat memiliki konten yang sesuai ditransklusikan (jika perlu). Itu standalone, jadi kami menempatkannya dalam ruang lingkup terisolasi juga untuk mengatakan: "Jangan main-main dengan ini. Saya memberi Anda API yang didefinisikan melalui beberapa atribut ini."
Praktik terbaik yang baik adalah dengan mengecualikan hal-hal berbasis template dari directive link dan fungsi pengontrol sebanyak mungkin. Ini memberikan titik konfigurasi "seperti API" lainnya: pengguna direktif dapat dengan mudah mengganti templat! Fungsionalitasnya tetap sama, dan API internalnya tidak pernah disentuh, tetapi kami dapat mengacaukan styling dan implementasi DOM sebanyak yang kami butuhkan. ui / bootstrap adalah contoh yang bagus tentang bagaimana melakukan ini dengan baik karena Peter & Pawel mengagumkan.
Cakupan isolasi juga bagus untuk digunakan dengan transklusi. Ambil tab; mereka tidak hanya seluruh fungsionalitas, tetapi apa pun yang ada di dalamnya dapat dievaluasi secara bebas dari dalam lingkup induk sambil meninggalkan tab (dan panel) untuk melakukan apa pun yang mereka inginkan. Tab jelas memiliki sendiri negara , yang termasuk di lingkup (untuk berinteraksi dengan template), tetapi bahwa negara tidak ada hubungannya dengan konteks yang digunakan - itu sepenuhnya internal untuk apa yang membuat tab direktif direktif tab. Lebih jauh, tidak masuk akal untuk menggunakan arahan lain dengan tab. Itu adalah tab - dan kami sudah mendapatkan fungsionalitas itu!
Kelilinginya dengan lebih banyak fungsionalitas atau transklusikan lebih banyak fungsi, tetapi arahan sudah seperti itu.
Semua yang mengatakan, saya harus mencatat bahwa ada cara di sekitar beberapa keterbatasan (yaitu fitur) dari ruang lingkup yang terisolasi, seperti @ProLoser mengisyaratkan dalam jawabannya. Sebagai contoh, di bagian lingkup anak, saya menyebutkan interpolasi pada atribut non-direktif melanggar ketika menggunakan ruang lingkup isolat (secara default). Tetapi pengguna dapat, misalnya, cukup menggunakan class="item-type-{{$parent.item.type}}"
dan itu sekali lagi akan berfungsi. Jadi, jika ada alasan kuat untuk menggunakan ruang lingkup terisolasi di atas ruang lingkup anak tetapi Anda khawatir tentang beberapa keterbatasan ini, ketahuilah bahwa Anda dapat mengatasi hampir semua dari mereka jika Anda perlu.
Ringkasan
Arahan tanpa ruang lingkup baru hanya untuk dibaca; mereka sepenuhnya tepercaya (yaitu internal ke aplikasi) dan mereka tidak menyentuh jack. Arahan dengan cakupan anak menambah fungsionalitas, tetapi itu bukan satu-satunya fungsi. Terakhir, lingkup isolasi adalah untuk arahan yang merupakan tujuan keseluruhan; mereka berdiri sendiri, jadi tidak apa-apa (dan paling "benar") untuk membiarkan mereka nakal.
Saya ingin mengeluarkan pikiran awal saya, tetapi karena saya memikirkan lebih banyak hal, saya akan memperbarui ini. Tapi sial - ini panjang untuk jawaban SO ...
PS: Benar-benar tangensial, tetapi karena kita berbicara tentang ruang lingkup, saya lebih suka mengatakan "prototipikal" sedangkan yang lain lebih suka "prototipal", yang tampaknya lebih akurat tetapi hanya menggelindingkan lidah sama sekali tidak baik. :-)