Подтвердить что ты не робот

Почему несколько директив не могут запросить изолированный объект на одном элементе?

Если Angularjs - Несколько директив по элементу с одним из которых изолируют область видимости правильно, изолированная область привязана к директиве, так почему бы возникнуть какие-либо столкновения? В документации для этой ошибки указано, что processing them would result in a collision or an unsupported configuration. Я не покупаю это. Несколько директив уже используют область видимости элемента, которая, несомненно, будет включать конфликты/неподдерживаемые конфигурации. Я пробовал искать "почему" на этом, но пришел с пустыми руками.

Может кто-нибудь объяснить/дать пример, где это действительно создало бы конфликт или неподдерживаемую конфигурацию?

4b9b3361

Ответ 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(), которая полезна в директивах модульного тестирования, возвращает изолированную область, связанную с элементом. Разрешение нескольких изолированных областей означало бы, что эта функция будет более сложной, вынуждая возвращать, возможно, какой-то хэш директивного имени для выделенных областей области.

Достаточно ли этого, чтобы оправдать дизайнерское решение не допускать множественные изолированные области, я должен признать, что я не уверен...