Почему несколько директив не могут запросить изолированный объект на одном элементе?
Если Angularjs - Несколько директив по элементу с одним из которых изолируют область видимости правильно, изолированная область привязана к директиве, так почему бы возникнуть какие-либо столкновения? В документации для этой ошибки указано, что processing them would result in a collision or an unsupported configuration
. Я не покупаю это. Несколько директив уже используют область видимости элемента, которая, несомненно, будет включать конфликты/неподдерживаемые конфигурации. Я пробовал искать "почему" на этом, но пришел с пустыми руками.
Может кто-нибудь объяснить/дать пример, где это действительно создало бы конфликт или неподдерживаемую конфигурацию?
Ответы
Ответ 1
Почему несколько директив одного элемента не имеют отдельных изолированных областей
Ответ прост - для привязки дочерних элементов требуется только одна область (см. источник), поскольку назначение области свойства, выполняемые в элементах-потомках, должны иметь четкую цель. Остальное - вопрос формулировки.
В то время как это уместно, в некотором смысле, ссылаться на создаваемый объем выделения, "для этой конкретной директивы" (как это делает связанный ответ), это только в том смысле, что директива, запрашивающая изоляцию, является единственной из директив этого элемента для доступа к изолированной области. Таким образом, область создается, чтобы изолировать директиву и дочерние элементы от остальной части этого "уровня" DOM.
Почему несколько директив не могут иметь одну и ту же изолированную область
Предоставление нескольких директив одной и той же изолированной области может привести к столкновению конфигураций связывания областей (несколько директив могут пытаться привязать к одному и тому же свойству в изолированной области).
Почему директивы с более низким приоритетом не могут использовать изолированную область
Простой и убедительный аргумент состоит в том, что {{interpolated.expressions}}
в элементе нужно оценивать с той же областью, что и plain expressions
(поставляется в директивы, которые их поддерживают), иначе все это будет полным беспорядком. (Например, поскольку интерполяция {{expressions}}
выполняется отдельно, директива, принимающая plain expression
в одном атрибуте и String
в другом, может быть сконфигурирована с выражениями, оцененными в разных областях.)
Если им действительно нужно, они могут получить доступ к изолированной области (но для этого требуется Debug Data). Если они имеют более низкий приоритет, чем директива, создающая область изоляции, они могут просто использовать element.isolateScope()
в своей функции связывания (см. Демонстрацию).
Ответ 2
Это, скорее всего, потому, что области привязаны на уровне элемента (AFAIK). Таким образом, у данного элемента существует только одна область, связанная с ним, которая может быть одной из родительских, дочерних или изолированных. Документация Scope в руководстве AngularJS также ссылается на это (https://docs.angularjs.org/guide/scope)
Ни один элемент не может иметь несколько связанных с ним областей (по дизайну), поскольку области видимости представляют собой структуру приложения, а также контекст для любого данного элемента.
Из-за этого, когда две директивы одного элемента запрашивают изолированную область, AngularJS распознает, что ему нужно будет создать две разные области действия, которые удовлетворяют одному и тому же элементу, что не поддерживается. Единственным способом было бы каким-то образом объединить две области действия, чтобы учесть его основное предположение, которое может вызвать столкновения, если две изолированные области запрашивают привязку к той же переменной области видимости, что и
scope: { myData: '=' }
Теперь, если обе директивы запрашивают это или добавляют определенные функции в область видимости, вы попадаете в неизведанную территорию, в зависимости от того, какая директива выполняется в первую очередь.
Ответ 3
Одна из причин может заключаться в том, что функция isolateScope()
, которая полезна в директивах модульного тестирования, возвращает изолированную область, связанную с элементом. Разрешение нескольких изолированных областей означало бы, что эта функция будет более сложной, вынуждая возвращать, возможно, какой-то хэш директивного имени для выделенных областей области.
Достаточно ли этого, чтобы оправдать дизайнерское решение не допускать множественные изолированные области, я должен признать, что я не уверен...