Яке чудове запитання! Я люблю , щоб почути те , що кажуть інші, але ось принципи , які я використовую.
Висота приміщення: область використовується як "клей", який ми використовуємо для зв'язку між батьківським контролером, директивою та шаблоном директиви.
Область для батьків:, scope: false
отже, жодної нової сфери
Я не використовую це дуже часто, але, як сказав @MarkRajcok, якщо директива не отримує доступу до змінних областей (і, очевидно, не встановлює жодної!), То це добре, наскільки я переживаю. Це також корисно для дочірніх директив, які використовуються лише в контексті батьківської директиви (хоча з цього завжди є винятки) і не мають шаблону. В основному все, що стосується шаблону, не належить до спільного використання сфери, тому що ви по суті викриваєте це поле для доступу та маніпулювання (але я впевнений, що з цього правила є винятки).
Як приклад, я нещодавно створив директиву, яка малює (статичну) векторну графіку за допомогою бібліотеки SVG, яку я перебуваю в процесі написання. Він має $observe
два атрибути ( width
і height
) і використовує їх у своїх обчисленнях, але він не встановлює і не читає жодних змінних областей і не має шаблону. Це хороший випадок використання для створення іншого обсягу; нам це не потрібно, то навіщо турбуватися?
Але в іншій директиві SVG мені потрібен набір даних для використання, а також потрібно було зберігати крихітний стан. У цьому випадку використання батьківської області було б безвідповідальним (знову ж таки, загалом кажучи). Тож замість цього ...
Область застосування дитини: scope: true
Директиви, що стосуються сфери використання дитини, усвідомлюються контекстом і призначені для взаємодії з поточною сферою застосування.
Очевидно, що ключовою перевагою цього над ізоляційною сферою є те, що користувач може вільно використовувати інтерполяцію на будь-які атрибути, які вони хочуть; наприклад, використання class="item-type-{{item.type}}"
директиви з областю ізоляту не працюватиме за замовчуванням, але добре працює на одній із дочірньою областю, тому що все, що інтерпольовано, все ще може бути знайдено у батьківській області. Крім того, сама директива може безпечно оцінювати атрибути та вирази в контексті її власної сфери, не турбуючись про забруднення батьків чи пошкодження батьків.
Наприклад, підказка - це те, що лише додається; область ізоляції не буде працювати (за замовчуванням див. нижче), оскільки очікується, що ми тут використаємо інші директиви або інтерпольовані атрибути. Підказка - це лише доповнення. Але підказка також потребує встановлення деяких речей щодо сфери використання під-директиви та / або шаблону і, очевидно, для управління власним станом, тому було б зовсім погано використовувати батьківську область. Ми або забруднюємо його, або пошкоджуємо його, і жодне не буено.
Я вважаю, що частіше використовую область застосування дітей, ніж ізолюючу та батьківську сфери.
Ізоляція сфери застосування: scope: {}
Це для багаторазових компонентів. :-)
Але серйозно, я вважаю "багаторазові компоненти" як "автономні компоненти". Намір полягає в тому, що вони повинні використовуватися для певної мети, тому поєднання їх з іншими директивами або додавання інших інтерпольованих атрибутів до вузла DOM по суті не має сенсу.
Щоб бути більш конкретним, все, що потрібно для цієї самостійної функціональності, надається через визначені атрибути, оцінені в контексті батьківської області; вони є або односторонніми рядками ('@'), односторонніми виразами ('&'), або двосторонніми змінними прив'язками ('=').
На автономних компонентах не має сенсу застосовувати інші директиви чи атрибути, оскільки вони існують самі по собі. Її стиль регулюється власним шаблоном (за необхідності) і може містити відповідний зміст (за необхідності). Це автономно, тому ми ставимо його в окрему область, щоб також сказати: "Не псуйтеся з цим. Я даю вам визначений API за допомогою цих кількох атрибутів".
Найкраща найкраща практика - виключити якомога більше матеріалів на основі шаблонів із директивних посилань та функцій контролера. Це забезпечує ще одну точку конфігурації "подібної API": користувач директиви може просто замінити шаблон! Усі функціональні можливості залишалися однаковими, і його внутрішній API ніколи не торкався, але ми можемо возитися зі стилізацією та реалізацією DOM стільки, скільки нам потрібно. ui / bootstrap - чудовий приклад того, як це зробити добре, оскільки Пітер і Пауль - приголомшливі.
Ізоляційні сфери також чудово підходять для використання при виключенні. Візьміть вкладки; вони є не лише всією функціональністю, але і тим, що знаходиться всередині неї, можна вільно оцінювати з батьківського простору, залишаючи вкладки (та панелі) робити все, що вони хочуть. Вкладки явно мають власний стан , який належить до сфери застосування (для взаємодії з шаблоном), але цей стан не має нічого спільного з контекстом, в якому він використовувався - він цілком внутрішній тому, що робить директиву вкладки директивою вкладки. Крім того, не має сенсу використовувати будь-які інші директиви з вкладками. Вони вкладки - і ми вже отримали цю функціональність!
Оточуйте його з більшою функціональністю або виключаєте більше функціональності, але директива є такою, яка вона є вже зараз.
Все, що було сказано, я мушу зазначити, що існують способи навколо деяких обмежень (тобто особливостей) області ізоляції, як @ProLoser натякнув у своїй відповіді. Наприклад, у розділі дочірньої області я згадав про інтерполяцію про недирективні атрибути, які порушуються під час використання області ізоляції (за замовчуванням). Але користувач міг, наприклад, просто скористатися, class="item-type-{{$parent.item.type}}"
і це знову запрацює. Тож якщо є вагома причина використовувати ізоляторну область над дочірньою сферою, але ви переживаєте через деякі з цих обмежень, знайте, що ви можете обійти практично всі з них, якщо вам потрібно.
Підсумок
Директиви, які не мають нової сфери застосування, є лише для читання; їм повністю довіряють (тобто внутрішні програми), і вони не торкаються гнізда. Директиви з дочірньою сферою додають функціональності, але вони не єдина функціональність. Нарешті, виділити сфери застосування для директив, які є цілою ціллю; вони є окремими, тому добре (і більшість «правильних») відпускати їх ізгоями.
Мені хотілося вияснити свої початкові думки, але, як я думаю над іншими речами, я це оновлю. Але святе лайно - це довго відповідь ТАК ...
PS: Цілком тангенціальна, але оскільки ми говоримо про сфери, я вважаю за краще "прототипічний", тоді як інші вважають за краще "прототипічний", який, здається, є більш точним, але просто скачує язик зовсім не добре. :-)